下载的pdf文件出错 - ASP经典

时间:2013-07-24 08:00:09

标签: asp-classic

我正在创建一个下载管理器,一切似乎都有效。但是我下载的文件无法打开。该文件具有正确的名称和扩展名.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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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(再次确认)

答案 2 :(得分: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