You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Classic ASP:API返回PDF下载后无法打开的问题排查

问题根源:二进制内容被文本编码破坏了

你遇到的PDF无法打开的问题,核心原因是错误地用文本方式处理了二进制的PDF数据,导致原始字节流被篡改,文件损坏。

具体来说,你的代码里有两个关键错误:

  1. 使用xmlhttp.responseText获取API返回的PDF内容:responseText是专门用于处理文本数据的,它会把二进制的PDF字节按照服务器返回的编码(或默认编码)转换成字符串,这个过程会破坏PDF的原始字节结构——比如某些二进制值会被转义或替换,导致文件无法被PDF阅读器识别。
  2. 使用response.write输出内容:同样,response.write是处理文本输出的,它会再次对内容进行编码转换,进一步损坏二进制数据。

而Postman之所以能正常保存PDF,是因为它直接处理了API返回的原始二进制响应,没有经过文本编码转换。


修正方案

你需要修改两处代码,确保全程以二进制方式处理PDF数据:

1. 修改GetPDF函数,获取二进制响应

xmlhttp.responseText换成xmlhttp.responseBody,同时移除不必要的Content-Type请求头(GET请求不需要设置请求体的Content-Type):

public function GetPDF(sToken)
    Set xmlhttp = CreateObject("Msxml2.ServerXMLHTTP.6.0")
    xmlhttp.open "GET", "www.fakeUrl.com/rest/download", false
    xmlhttp.setRequestHeader "Authorization", "Bearer "& sToken
    ' 移除多余的Content-Type头,GET请求无请求体,不需要这个设置
    ' xmlhttp.setRequestHeader "Content-Type", "application/json; charset=UTF-8"
    xmlhttp.send ""
    ' 用responseBody获取原始二进制字节数组
    GetPDF = xmlhttp.responseBody
end function

2. 修改PDF.asp的输出逻辑,用二进制方式输出

response.write换成Response.BinaryWrite,确保直接发送原始字节:

Response.AddHeader "Content-Disposition","attachment; filename=name.pdf"
Response.ContentType = "application/pdf"
PDFcontent = GetPDF(strToken)
' 使用BinaryWrite输出二进制内容,避免文本编码转换
Response.BinaryWrite PDFcontent

为什么这样能解决问题?
  • responseBody返回的是未经任何编码处理的原始二进制字节数组,完全保留了API返回的PDF数据结构。
  • Response.BinaryWrite会直接把字节数组发送给客户端,不会进行任何文本编码转换,确保客户端接收到的是完整的、可识别的PDF文件。

这样修改后,下载的PDF文件就能正常打开了。

内容的提问来源于stack exchange,提问作者flyingmath

火山引擎 最新活动