【问题标题】:c#- Corrupt file when writing to Responsec#- 写入响应时文件损坏
【发布时间】:2020-09-09 02:17:34
【问题描述】:

我正在尝试使用 ASP.Net 将文件写入输出响应流。当我下载文件时,我收到Errors were found opening .zip file. You can extract files from this archive, but other programs may not be able to open it. Do you want to try fixing the problems? 错误。但是,我可以取消此操作并正确打开 zip 文件。

我做错了什么?

ASP.Net\C# 代码:

var pathToFile = "c:\abc.zip";
string fileName = Path.GetFileName(pathToFile);
byte[] buffer;
using (var fileStream = new FileStream(pathToFile, Filemode.open))
{
  buffer = new byte[fileStream. Length];
  fileStream.Read(buffer, 0, (int)fileStream.Length);
}
Response.Clear();
Response.Buffer = true;
Response.AppendHeader("content-disposition", string.Format(@"attachment; filename={0}.zip", filename));
Response.ContentType = "application/zip";
Response.AppendHeader("content-length", buffer.Length.ToString());
Response.WriteFile(pathToFile);

【问题讨论】:

  • 您可能没有阅读完整的文件。也无需将其存储在缓冲区中 - 您可以直接写入响应。
  • 我之前直接写入响应,而没有在响应标头中附加内容长度,但遇到了同样的错误。如何确保“我已阅读完整文件”?

标签: c# asp.net .net iis


【解决方案1】:

如果您想使用buffer 并将文件写入用户,请不要使用Response.WriteFile

更改为Response.OutputStream.Write,并修改您的代码,如下所示:

var pathToFile = "c:\abc.zip";
string fileName = Path.GetFileName(pathToFile);
byte[] buffer = new byte[0];
using (var fileStream = new FileStream(pathToFile, FileMode.Open, FileAccess.Read))
{
  buffer = new byte[fileStream.Length];
  fileStream.Read(buffer, 0, buffer.Length);
}
Response.Clear();
Response.AppendHeader("content-disposition", string.Format(@"attachment; filename={0}", filename));
Response.ContentType = "application/zip";
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
Response.End();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2013-03-19
    • 2011-01-22
    • 2011-01-11
    • 2019-01-09
    • 1970-01-01
    • 2019-10-17
    • 2021-09-12
    相关资源
    最近更新 更多