如何在HttpResponse中发送文件?

时间:2011-05-05 09:48:42

标签: asp.net

在我的应用程序中,用户可以在单击链接后下载文件。文档是在代码中生成的PDF / RTF。我用:

byte[] downloadBytes = some pdf document bytes...
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.Clear();
response.AddHeader("Content-Type", "binary/octet-stream");
response.AddHeader("Content-Disposition",
                "attachment; filename=filename.pdf; size=" + downloadBytes.Length.ToString()); 
response.Flush();
response.BinaryWrite(downloadBytes);
response.Flush();
response.End();

它运作正常,但这通常是一个好方法吗?为什么要冲洗两次?我发现了很多不同的例子,这个例子很好但有时我遇到The remote host closed the connection. The error code is 0x80070057错误。我找到了应该使用的解决方案

if (Response.IsClientConnected)
{
     Response.Flush();
     Response.End();
}

整个代码应该如何?

2 个答案:

答案 0 :(得分:3)

这是我使用的代码。它根本不会调用flush。我不确定这是否正确,但它对我有用。

public static void ResponseOpenFileBytes(byte[] File, string ContentType, string SaveAsFileName, HttpResponse response)
{
    if (string.IsNullOrEmpty(ContentType))
    {
        ContentType = "application/octet-stream";
    }

    response.Clear();
    response.AddHeader("content-disposition", "attachment;filename=" + SaveAsFileName);
    response.ContentType = ContentType;
    response.BinaryWrite(File);
    response.End();
}

答案 1 :(得分:2)

我不明白为什么你应该拨打Flush()两次。一个就足够了,之后调用BinaryWrite()

第一次拨打Flush()会将标头发送到浏览器,包括Content-Length,这在通话时仍然未知 - 或者只是错误。

另外,除非绝对必要,否则我会避免致电End()