我有一个通用处理程序,它提供文件以供下载:
Dim request As HttpRequest = context.Request
Dim response As HttpResponse = context.Response
response.ContentType = "application/octet-stream"
response.AddHeader("content-disposition", "inline; filename=" & filename)
response.Buffer = True
response.OutputStream.Write(fileBytes, 0, fileBytes.Length)
response.Flush()
response.Close()
('fileBites' 是我的咬合数组,'filename' 是我的文件名)。
例如,当 fileBites 是一个 .txt 文件时 - 下载被触发并且文件被完美读取。
但是,我发现 .pdf 和 .docx 文件已损坏 - 对于 .docx,Word 说需要恢复该文件并请求我允许这样做。当我授予此权限时,它立即修复并完美显示。
显然我不希望用户看到这个腐败对话,经过一段时间的研究,我发现了这个:http ://forums.asp.net/t/1301978.aspx/1/10 - 这表明了腐败的原因是否在字节数组的末尾写入了一个额外的空位:我通过将长度减少一位来检查:
response.OutputStream.Write(fileBytes, 0, fileBytes.Length - 1)
就像魔术一样,.docx 下载现在可以工作了!(这不是我当前的问题,我将其包含在上下文中,以防其他人有同样的问题)
我目前的问题是,虽然 .docx 文件现在可以正确流式传输,但 .pdf 文件却没有。它们似乎是一块传输(以正确的 KB 大小),但是当我尝试打开下载的文件时,Adobe Reader X 告诉我:
Adobe Reader could not open xxxx because it is either not a supported file type
or because the file has been damaged (for example, it was sent as an email
attachment and wasn't correctly decoded).
在 2008 年的 adobe 论坛 ( http://forums.adobe.com/thread/391712 )上进行了相当长的未解决讨论,解决了这个确切的问题,但现在已经死了。我已经尝试了用户发布的所有解决方法(内容类型:/pdf 不是 /octet,处置:应用程序不是内联,不同的内容编码和字符集等),但都无济于事。
我想知道在此之前是否有人遇到过这个问题,可以指出我在某个地方模糊地近似于一些甚至与正确方向相似的东西!