从ASP.NET页面下载.docx文件时文件损坏

3
问题在于所有支持的文件都可以正常工作(如jpg、gif、png、pdf、doc等),但是当我下载.docx文件时,它会显示为损坏,并且需要通过Office进行修复才能打开。
这是我的代码:
Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
Response.BinaryWrite(RptBytes);
stream.Dispose();
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();

我从其他网站得到了解决方案,

i.e

原来,docx格式需要在Response.BinaryWrite之后立即使用Response.End(),而不是HttpContext.Current.ApplicationInstance.CompleteRequest()

为什么从ASP.NET页面下载.docx文件时会损坏?

这样做可以正常工作,但是Response.End会抛出线程被中止的异常。


1
我的猜测是你所有的下载都已经损坏了,只不过某些文件格式比其他文件格式更容易原谅。在 jpg 或 gif 文件中出现一个错误字节可能不会被显示图像的软件注意到。然而,docx 文件实际上是 zip 文件,对于损坏的字节更加严格。我会这样做:1. 将文件流读入字节数组,2. 关闭/释放流,然后通过 BinaryWrite 将字节数组写入响应。 - Walter Stabosz
@Walter Stabosz 我想这可以写成一个答案而不是一个评论... - Pantelis Natsiavas
1个回答

3

将我的评论复制到回答中:

我猜测您所有的下载都是损坏的,只不过有些文件格式比其他格式更容易原谅。一张 jpg 或 gif 图像上的一个错误字节可能不会被显示图像的软件注意到。但是,docx 文件实际上是 zip 文件,对损坏的字节更加严格。

我会这样做:

  1. 读取文件流到一个字节数组中
  2. 关闭/释放流
  3. 然后通过 BinaryWrite 将字节数组写入到 Response

    // read the file to a byte array byte[] RptBytes = File.ReadAllBytes(pathToFile);

然后按照https://dev59.com/bmYr5IYBdhLWcg3wTYm4#15869303中的代码进行操作。

我认为您的问题在于您如何处理 Response。您可以只按照那个答案中的示例代码来操作,跳过整个字节数组的部分。


我参考了你的链接。那里面的masterPresentation是什么?我该如何使用它? - Vignesh Kumar A
masterPresentation 是用户在代码示例之外定义的本地变量。目前为止,我已经尽力帮助你了。听起来你可能对分配给你的编程任务有些难以应付了。 - Walter Stabosz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接