在 Classic ASP 中将网络文件加载到流中时出错
Errors Loading a Network File into a Stream in Classic ASP
我有一个经典 ASP 网站,该网站当前从本地目录加载 PDF 文件并将它们写入响应。我创建了一个流并使用 LoadFromFile 来提取数据。这多年来一直运作良好,但我们现在想要删除本地文件并从网络“\”驱动器中提取,我们所有的 .NET 站点都从中提取文件。
我们在 .NET 站点中执行此操作没有问题,但我不知道如何从 Classic ASP 打开网络文件并将其加载到流中。我尝试过的任何事情似乎都无法将“\server\directory\file”识别为有效路径。
所以,为了尽可能清楚,这就是我们所做的:
- 从 QueryString 中提取一个 DocID。
- 将 DocID 作为参数传递给 SQL 过程以拉取文件路径(在当前 ASP 页面中它拉取本地路径,在 .NET 中它拉取网络路径. 在我们新的 ASP 页面中,它现在将提取网络路径)。
- 我们创建一个流并将文件加载到其中(如果路径是“\”而不是 "D:\",那么这部分在 Classic ASP 中不起作用)。
- 我们将 Response.ContentType 更改为 "application/pdf"。
- 我们 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我的头。
我有一个经典 ASP 网站,该网站当前从本地目录加载 PDF 文件并将它们写入响应。我创建了一个流并使用 LoadFromFile 来提取数据。这多年来一直运作良好,但我们现在想要删除本地文件并从网络“\”驱动器中提取,我们所有的 .NET 站点都从中提取文件。
我们在 .NET 站点中执行此操作没有问题,但我不知道如何从 Classic ASP 打开网络文件并将其加载到流中。我尝试过的任何事情似乎都无法将“\server\directory\file”识别为有效路径。
所以,为了尽可能清楚,这就是我们所做的:
- 从 QueryString 中提取一个 DocID。
- 将 DocID 作为参数传递给 SQL 过程以拉取文件路径(在当前 ASP 页面中它拉取本地路径,在 .NET 中它拉取网络路径. 在我们新的 ASP 页面中,它现在将提取网络路径)。
- 我们创建一个流并将文件加载到其中(如果路径是“\”而不是 "D:\",那么这部分在 Classic ASP 中不起作用)。
- 我们将 Response.ContentType 更改为 "application/pdf"。
- 我们 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我的头。