【问题标题】:Downloading a file with response doesn't show a filesize下载带有响应的文件不显示文件大小
【发布时间】:2011-12-05 12:21:33
【问题描述】:

我在函数中有这段代码:

Response.Clear();
Response.ContentType = "text/xml; charset=utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=test.xml");
// Put xml into response here
Response.End();

这有效,但是,当它不显示文件大小时,在 Firefox 中它显示文件大小 -1 和在 chrome 中,即它根本不显示文件大小。如何显示文件大小?

【问题讨论】:

  • 您需要一个额外的标头 Content-Length: xxxx(其中 'xxxx' 是文件大小,以字节为单位)

标签: c# asp.net html


【解决方案1】:

你试过给这个吗:

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

如果设置了内容长度,网络浏览器将在下载时显示进度条。对于中型和大型文件来说,这是一个非常重要的可用性功能,您真的很想要它。您希望您的用户知道他们已经走了多远,所以他们不会取消下载并重新开始,或者更糟的是放弃您的网站。 Refer

【讨论】:

  • 感谢您的回答,但我将输出流式传输到 Response.Output。有什么办法可以得到 Response.Output 的大小?
  • 你用过Response.OutputStream.Length 吗?我还没有尝试过这个,但如果这有帮助,请告诉我?
  • 我为此创建了一个单独的问题,因为这是一个不同的问题:stackoverflow.com/questions/8385689/get-response-output-size
【解决方案2】:

如果您的响应是 System.Net.Http.HttpResponseMessage 类型,您可以使用以下方法插入 Content-Length 标头:

response.Content.Headers.ContentLength = <length in bytes>;

如果您正在流式传输文件,您的代码可能如下所示:

FileStream fileStream = File.Open("<source file name>", FileMode.Open);
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentLength = fileStream.Length;
response.Content.Headers.ContentType = 
  new MediaTypeHeaderValue("<media type e.g. application/zip>");
response.Content.Headers.ContentDisposition = 
  new ContentDispositionHeaderValue("file")
    {
      FileName = "<destination file name>"
    };
return response;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2020-08-29
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多