我正在使用ASP.NET HttpHandler进行测试,以便直接在响应流上下载文件,我不太确定我这样做的方式。这是一个示例方法,将来文件可以存储在数据库中的BLOB中:
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
但是,我不确定这是否正确或有更好的方法来做到这一点。 我的问题是:
很抱歉这么多问题,我在网络开发方面很陌生:P
干杯。
答案 0 :(得分:17)
Content-Disposition
标头)。因此,它不知道显示文件对话框。如果整个响应被缓冲(如果你从不刷新)或者你自己设置,Content-Length
标头只会被设置。在这种情况下,您可以并且应该自己设置它;写
response.AppendHeader("Content-Length", new FileInfo(path).Length.ToString());
Flush
,您可以立即向线路发送响应,而无需任何缓冲。但是,为了提高性能,您可以使用GZIP压缩。答案 1 :(得分:2)
答案 2 :(得分:2)
对于#3,您需要在http响应中设置content-length标头。其中许多值来自http标头。
我相信您可以通过将响应对象上的缓冲属性更改为false来更改缓冲区。有一段时间没有这样做,所以我不记得它可能是什么。