【问题标题】:File download truncated if Response.Close() is called如果调用 Response.Close(),文件下载会被截断
【发布时间】:2009-11-16 19:13:53
【问题描述】:

好的,所以我有一个页面,它从 web 服务中获取一个文件作为 Byte[],然后我给用户一个保存/取消对话框来保存该文件。该文件可以是 xml 或 cvs 格式。下载文件时,文件不完整,例如这是文件应具有的内容:
美元,欧元,欧元,1.2,1.1,11/15/2009,15:23:27
美元,澳元,澳大利亚,1.25,1.15,11/15/2009,15:23:27

但是从浏览器保存时它只有::
美元,欧元,欧元,1.2,1.1,11/15/2009,15:23:27
USD,AUD,Australian,1.25,1.

这是我的代码:

Response.Buffer = true;
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); 
Response.AddHeader("Content-Length", MyFile.Length.ToString()); 
FileInfo file = new FileInfo(fileName); 
Response.ContentType = Utility.ReturnExtension(file.Extension.ToLower()); 
Response.BinaryWrite(MyFile); 
Response.Flush(); 
Response.Close(); 
Response.End();

我已经通过写入文件确保我从 web 服务获取的字节 [] 是正常的 在我的机器上使用以下代码:

StreamWriter writer = null;
string blah = System.Text.ASCIIEncoding.ASCII.GetString(MyFile);
writer = File.CreateText(Server.MapPath(filePath+fileName));
writer.Write(blah);
writer.Close();
writer.Dispose();

如果我删除 Close() 和 End(),则整个文件将使用页面中的一些 HTML 代码呈现。 如果我首先在本地机器上创建/写入文件,然后执行 Response.TransmitFile(file),我会得到完整的文件(仅限 XML 格式)。

我不确定我做错了什么。也许它只是一些非常简单的事情。任何帮助将不胜感激

【问题讨论】:

  • 在 Fiddler 中观看您的下载。查看报告了哪些错误消息(如果有)。 RyanD 的答案可能是正确的。

标签: c# .net download


【解决方案1】:

如果我在Response.Flush() 之后调用Response.Close(),我遇到了一个CSV 文件在响应中被截断的问题。

我的解决方案是替换这个:

 try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.Flush(); 
      response.Close();
 }

有了这个:

try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.End();
 }

Response.End() 会将所有缓冲的内容刷新到客户端。尝试从您的响应处理程序中删除 Response.Close()

【讨论】:

【解决方案2】:

尝试删除

Response.AddHeader("Content-Length", MyFile.Length.ToString()); 

然后看看当你这样做时你是否得到了完整的文件。如果你这样做了,那么你的文件长度很差。

【讨论】:

  • 我确实尝试删除“内容长度”,但没有运气。我还尝试将长度设置为高于它得到的长度,但仍然没有用。
【解决方案3】:

您可能正在填满响应缓冲区。尝试无缓冲发送,或者如果这不起作用,则将文件分散到多个 binarywrite 调用中,并在每次调用后刷新缓冲区。

【讨论】:

  • 尝试无缓冲地发送它,但这并没有解决问题。由于文件很小,因此没有尝试将文件分散到多个 binarywrite 调用中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多