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



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

我们在 .NET 站点中这样做没有问题,但我无法弄清楚如何从经典 ASP 打开网络文件并将其加载到流中。我尝试过的任何内容似乎都没有将"\服务器\目录\文件"识别为有效路径。

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

  1. 从查询字符串中提取 DocID。
  2. 将 DocID 作为参数传递给 SQL 进程以拉取文件的路径(在当前 ASP 页中,它拉取本地路径,在 .NET 中拉取网络路径。在我们新的ASP页面中,它现在将拉取一个网络路径)。
  3. 我们创建一个流并将文件加载到其中(如果路径是"\"而不是"D:\",则这是在经典ASP中不起作用的部分)。
  4. 我们将 Response.ContentType 更改为"application/pdf"。
  5. 我们响应.二进制写入并刷新响应。

结果是页面显示的 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 中调出该网站,单击"基本设置"并使用"连接为..."按钮以在同一常规帐户下运行站点。这纠正了我的问题。拍打我的头。

相关内容

  • 没有找到相关文章

最新更新