0

我正在创建一个下载管理器,一切似乎都正常。但是我下载的文件无法打开。该文件具有正确的名称和扩展名 .pdf - 但我的 Mac 说该文件无法打开(服务器上的文件有效)。

if request.querystring("downloadFile") <> "" then

    strFilePath = Server.MapPath("/_customerFiles/"& session("URLmapping") &"/documents/"& request.querystring("downloadFile"))

    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

    If objFSO.FileExists(strFilePath) Then
        Set objFile = objFSO.GetFile(strFilePath)
        intFileSize = objFile.Size
        Set objFile = Nothing

        strFileName = request.querystring("filename")
        strFileName = replace(request.querystring("downloadFile")," ","-")

        Response.AddHeader "Content-Disposition","attachment; filename=" & strFileName
        Response.ContentType = "application/octet-stream"
        Response.AddHeader "Content-Length", intFileSize

        Set objStream = Server.CreateObject("ADODB.Stream")
        objStream.Open
        objStream.Type = 1 'adTypeBinary '
        objStream.LoadFromFile strFilePath

        Do While Not objStream.EOS And Response.IsClientConnected
            Response.BinaryWrite objStream.Read(1024)
            Response.Flush()
        Loop

        objStream.Close
        Set objStream = Nothing

    End if

    Set objFSO = Nothing

end if
4

3 回答 3

0

您是否考虑过输出流添加(或可能删除)字节顺序标记(BOM)?我会在十六进制编辑器中打开这两个文件并查找在开始时添加的 3 个字节(以及其他所有内容)。

于 2013-07-25T22:38:58.460 回答
0

我知道我迟到了这个问题,但我只是在处理类似的事情,并想分享我的观察结果以试图澄清它。

  1. 我已经读过(对不起,我没有消息来源)必须在调用之前指定ADODB.Stream.Type.Open
  2. 我还将 Stream.Mode属性设置为 3(意思是“打开文件以供阅读”),以防止多人同时尝试访问文件时出现文件访问锁定错误——也必须在调用之前完成.Open
  3. 我在 . 上取得了不同程度的成功Response.ContentType "application/octet-stream",在出现了一些问题之后,我将我的改为Response.ContentType "xxx/xxx". 浏览器会将其作为未知文件类型接受,然后根据该文件扩展名的注册程序提示用户打开它。
  4. 在开始添加响应标头之前,您应该调用Response.Clear(只是为了确保您没有发送额外的标记)
  5. 关闭后FileSystemObject,您应该致电Response.End(再次确定)
于 2013-08-15T13:52:33.430 回答
0

您需要在 Response.AddHeader 之前添加 Response.Clear 并更改 Response.ContentType,因此代码如下所示:

if request.querystring("downloadFile") <> "" then

strFilePath = Server.MapPath("/_customerFiles/"& session("URLmapping") &"/documents/"& request.querystring("downloadFile"))

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strFilePath) Then
    Set objFile = objFSO.GetFile(strFilePath)
    intFileSize = objFile.Size
    Set objFile = Nothing

    strFileName = request.querystring("filename")
    strFileName = replace(request.querystring("downloadFile")," ","-")

    Response.Clear
    Response.AddHeader "Content-Disposition","attachment; filename=" & strFileName
    Response.ContentType = "xxx/xxx"
    Response.AddHeader "Content-Length", intFileSize

    Set objStream = Server.CreateObject("ADODB.Stream")
    objStream.Open
    objStream.Type = 1 'adTypeBinary '
    objStream.LoadFromFile strFilePath

    Do While Not objStream.EOS And Response.IsClientConnected
        Response.BinaryWrite objStream.Read(1024)
        Response.Flush()
    Loop

    objStream.Close
    Set objStream = Nothing

End if

Set objFSO = Nothing

End if
于 2018-09-24T12:59:09.640 回答