将PDF流写入响应流

3
我在尝试从我的asp.net页面运行以下代码时遇到了问题。 代码来自另一篇文章(https://dev59.com/Rm025IYBdhLWcg3wvIko 当Test.pdf文件位于我的本地驱动器中时,单击对话框上的打开按钮后无法打开该文件。 当单击保存按钮时,文件以“C:\ Downloads”中的myAspPageName.pdf尝试保存,操作将永远进行而实际上不保存任何内容。
我确定我做错了什么。 感谢任何帮助。 是否有更好的方法来完成同样的事情?
protected void Page_Load(object sender, EventArgs e) 
{         
    Context.Response.Buffer = false;         
    FileStream inStr = null;         
    byte[] buffer = new byte[1024];         
    long byteCount; inStr = File.OpenRead(@"C:\Downloads\Test.pdf");         
    while ((byteCount = inStr.Read(buffer, 0, buffer.Length)) > 0) 
    {    
        if (Context.Response.IsClientConnected) 
        { 
            Context.Response.ContentType = "application/pdf";
            Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
            Context.Response.Flush();             
        }        
    }     
} 
2个回答

6
你可以使用 Response.WriteFile 来替代所有的缓冲区操作。
protected void Page_Load(object sender, EventArgs e) 
{         
    Context.Response.WriteFile(@"C:\Downloads\Test.pdf"); 
}

3
Response.TransmitFile在资源上更高效 - 它不会将文件缓存到内存中。 - Mike Brind

3
考虑使用 HttpResponse.TransmitFile(ASP.NET >= 2.0),特别是对于大文件,因为它能在不将文件缓冲到服务器内存中的情况下写入文件。
此外,请确保始终将Response.ContentType属性设置为适当的MIME类型,否则浏览器有时会在下载文件时出现问题,尤其是如果您从处理程序中编写文件。
Response.ContentType = "application/pdf";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接