我有一个经典的ASP网站,它目前从本地目录加载PDF文件并将它们写入响应。我创建了一个流并使用LoadFromFile来拉取数据。这多年来一直运行良好,但我们现在想要删除本地文件并从网络"\"驱动器中提取文件,我们所有的 .NET 站点都从该驱动器中提取文件。
我们在 .NET 站点中这样做没有问题,但我无法弄清楚如何从经典 ASP 打开网络文件并将其加载到流中。我尝试过的任何内容似乎都没有将"\服务器\目录\文件"识别为有效路径。
因此,为了尽可能清楚,这就是我们所做的:
- 从查询字符串中提取 DocID。
- 将 DocID 作为参数传递给 SQL 进程以拉取文件的路径(在当前 ASP 页中,它拉取本地路径,在 .NET 中拉取网络路径。在我们新的ASP页面中,它现在将拉取一个网络路径)。
- 我们创建一个流并将文件加载到其中(如果路径是"\"而不是"D:\",则这是在经典ASP中不起作用的部分)。
- 我们将 Response.ContentType 更改为"application/pdf"。
- 我们响应.二进制写入并刷新响应。
结果是页面显示的 PDF 没有指示文件名或位置。
添加部分代码:
' sets the Cache-Control HTTP header to prevent proxy caching
Response.CacheControl = "Private"
Response.Expires = 0
Response.Buffer = True
Response.Clear
sDocID = Request.QueryString("DocID")
sSQL = "exec Get_DocData '" & sDocID & "'"
Set rsDoc = Server.CreateObject("ADODB.RecordSet")
rsDoc.Open sSQL, conn, 3, 1
'
' sPath = \serverdirectoryfilename.ext
' sFileName = filename.ext
'
sPath = rsDoc.Fields("DocPath").Value
sFileName = rDoc.Fields("DocDescription").Value
rsDoc.Close
Set rsDoc = Nothing
'sPath = Replace(sPath,"\<svr><dir>","Z:")
If sPath <> "" Then
Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1 ' adTypeBinary
oStream.LoadFromFile sPath
Response.ContentType = "application/pdf"
Response.AddHeader "Content-Disposition", "inline; filename=""" & sFileName & """"
Response.Charset = "UTF-8"
Do while not oStream.EOS
Response.BinaryWrite oStream.read(3670016)
Response.Flush
Loop
oStream.Close
Set oStream = Nothing
Else
Response.ContentType = "text/html"
'Response.Write("Invalid Document ID.")
End If
Response.End
好吧,我知道当我弄清楚这一点时我会感到愚蠢。正如Lankymart评论的那样,LoadFromFile()确实支持UNC格式的路径,这让我怀疑这个问题是基于权限而不是基于代码的。
尽管我们的应用程序池在具有网络驱动器权限的常规帐户下运行,但该站点不是。我只是在 IIS7 中调出该网站,单击"基本设置"并使用"连接为..."按钮以在同一常规帐户下运行站点。这纠正了我的问题。拍打我的头。