0

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

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

我想知道在此之前是否有人遇到过这个问题,可以指出我在某个地方模糊地近似于一些甚至与正确方向相似的东西!

4

1 回答 1

0

(在评论和编辑中回答。请参阅没有答案的问题,但问题已在评论中解决(或在聊天中扩展)

OP写道:

盯着它看了好几个小时,在发布这个问题后不久答案就出现了——这经常是这样!无论如何,以下是解决我的具体问题的其他人的解决方案:

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

显然,某些东西在保存时将文件的名称嵌入到二进制对象中,并检查内容处置中提供的名称与打开时嵌入到文档中的名称。如果它们不匹配,则会引发损坏错误。

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

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

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

于 2015-01-26T22:27:59.753 回答