我有一个通用的处理程序,下载提供文件服务:流的PDF文件生成的Adobe阅读器损坏错误
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”是我咬阵列,文件名“”是我的文件名)。
当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).
有关于二零零八年的土坯论坛一个相当长的未解决的讨论( http://forums.adobe.com/thread/391712),解决这个确切的问题,但现在已经死了。我尝试了用户发布的所有解决方法(内容类型:/ pdf not/octet,处置:应用程序不内联,不同的内容编码和字符集等),但都无济于事。
我不知道是否有人遇到过这个问题,然后我可能会指向某个模糊的东西,甚至远远地类似于正确的方向!
您是否有我可以查看的样本损坏的PDF文件? – iPDFdev
“显然Adobe Reader在保存时将文件的名称嵌入到二进制对象中”这并非如此......首先,Adobe Reader通常不会生成PDF文件。我不知道什么解决了你的问题,但我99.9999%肯定这不是原因。 – yms
嗯,它只会在内容处理中发送原始文件名时才会打开?它必须对某些事物进行验证。 - 我会说,它是由创建PDF的应用程序嵌入的,但后来认识到,如果文件在文件系统内被重命名,则需要维护 - 我无法想象文件系统会重新嵌入它自己的路径,但从一个去构造性的pov,如果它只在发送确切的文件名时才起作用,那么这个文件名必须嵌入二进制对象的某个地方以识别匹配? –