2012-05-11 107 views
0

我有一个通用的处理程序,下载提供文件服务:流的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,处置:应用程序不内联,不同的内容编码和字符集等),但都无济于事。

我不知道是否有人遇到过这个问题,然后我可能会指向某个模糊的东西,甚至远远地类似于正确的方向!

+2

您是否有我可以查看的样本损坏的PDF文件? – iPDFdev

+0

“显然Adobe Reader在保存时将文件的名称嵌入到二进制对象中”这并非如此......首先,Adobe Reader通常不会生成PDF文件。我不知道什么解决了你的问题,但我99.9999%肯定这不是原因。 – yms

+0

嗯,它只会在内容处理中发送原始文件名时才会打开?它必须对某些事物进行验证。 - 我会说,它是由创建PDF的应用程序嵌入的,但后来认识到,如果文件在文件系统内被重命名,则需要维护 - 我无法想象文件系统会重新嵌入它自己的路径,但从一个去构造性的pov,如果它只在发送确切的文件名时才起作用,那么这个文件名必须嵌入二进制对象的某个地方以识别匹配? –

回答

0

(答案评价和编辑见Question with no answers, but issue solved in the comments (or extended in chat)

的OP写道:

它已经盯着几个小时,答案张贴这个问题后不久出现了 - 这是经常的办法!无论如何,这里是任何其他人坚持我的具体问题的决议:

当我添加一个文件到数据库中时,我也允许它被重命名。我会选择一个文件,给它一个名字并将其存储在数据库中作为[Fileblob],[Filename] - 我可以选择任意任意名称,因为它不再绑定到文件系统中的特定位置。 - 错! - 使用.txt和.docx文件,这很好,原始名称从未被调用过。

很显然,在保存文件时,文件的名称会嵌入到二进制对象中,并在打开文件时检查内容处置中提供的名称与嵌入到文档中的名称。如果它们不匹配,它会抛出一个腐败错误。现在

,我在数据库中存储为[Fileblob],[Filename],[originalFilename]文件并打开它时,我使用:

response.AddHeader("content-disposition", "inline;filename=" & originalFilename) 

..to给它理解的名称。我想更优雅的方式是将原始名称从PDF中删除,因为它不再需要,但作为解决方法,这工作得很好。