从.NET Generic Handler流式传输PDF文件会生成Adobe Reader损坏错误

时间:2012-05-11 12:31:02

标签: vb.net pdf stream httphandler

我有一个通用处理程序,可以提供下载文件:

    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 not / octet,处理:应用程序不是内联,不同的内容编码和字符集等),但都无济于事。

我想知道是否有人遇到过这个问题之前我可能会在某处隐约地看到一些甚至偏向正确方向的东西!

1 个答案:

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

..给它一个明白的名字。我想更优雅的方法是将PDF中的原始名称存储在数据库中,因为它不再需要,但作为一种解决方法,这很好用。