在 Classic ASP 中将网络文件加载到流中时出错

Errors Loading a Network File into a Stream in Classic ASP

我有一个经典 ASP 网站,该网站当前从本地目录加载 PDF 文件并将它们写入响应。我创建了一个流并使用 LoadFromFile 来提取数据。这多年来一直运作良好,但我们现在想要删除本地文件并从网络“\”驱动器中提取,我们所有的 .NET 站点都从中提取文件。

我们在 .NET 站点中执行此操作没有问题,但我不知道如何从 Classic ASP 打开网络文件并将其加载到流中。我尝试过的任何事情似乎都无法将“\server\directory\file”识别为有效路径。

所以,为了尽可能清楚,这就是我们所做的:

  1. 从 QueryString 中提取一个 DocID。
  2. 将 DocID 作为参数传递给 SQL 过程以拉取文件路径(在当前 ASP 页面中它拉取本地路径,在 .NET 中它拉取网络路径. 在我们新的 ASP 页面中,它现在将提取网络路径)。
  3. 我们创建一个流并将文件加载到其中(如果路径是“\”而不是 "D:\",那么这部分在 Classic ASP 中不起作用)。
  4. 我们将 Response.ContentType 更改为 "application/pdf"。
  5. 我们 Response.BinaryWrite 并刷新响应。

结果是页面显示 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 = \server\directory\filename.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 格式的路径,这让我怀疑问题是 permission-based 而不是 code-based。

虽然我们的 ApplicationPool 运行 是在一个拥有网络驱动器权限的普通帐户下,但该站点却没有。我只是在 IIS7 中调出站点,单击“基本设置”并使用 "Connect as..." 按钮将站点 运行 设置在同一通用帐户下。这纠正了我的问题。 Palm-slapping我的头。