在我的ASP.NET应用程序中,当我尝试使用以下代码打开PDF文件时,出现错误
用于显示PDF文件的代码
FileStream MyFileStream = new FileStream(filePath, FileMode.Open);
long FileSize = MyFileStream.Length;
byte[] Buffer = new byte[(int)FileSize + 1];
MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length);
MyFileStream.Close();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename="+filePath);
Response.BinaryWrite(Buffer);
我得到的错误
“打开此文档时出错。文件已损坏,无法打开”
答案 0 :(得分:1)
听起来像是使用aspx文件输出pdf。你考虑过使用一个HttpHandler的ashx文件吗?它绕过了所有典型的aspx开销,并且更有效地提供原始数据。
以下是使用您的代码的ashx示例:
<% WebHandler Language="c#" class="ViewPDF" %>
public class ViewPDF : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
FileStream MyFileStream = new FileStream(filePath, FileMode.Open);
long FileSize = MyFileStream.Length;
byte[] Buffer = new byte[(int)FileSize + 1];
MyFileStream.Read(Buffer, 0, (int)MyFileStream.Length);
MyFileStream.Close();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename="+filePath);
Response.BinaryWrite(Buffer);
}
public bool IsReusable
{
get { return false; }
}
}
如果您仍想使用aspx页面。确保您正在执行以下操作:
// At the beginning before you do any response stuff do:
Response.Clear();
// When you are done all your response stuff do:
Response.End();
这应该可以解决你的问题。
答案 1 :(得分:0)
您必须清除响应,否则会部分传输。
Response.Flush();
答案 2 :(得分:0)
除了ocedcio的回复之外,您还需要注意Stream.Read()
不一定会读取所有请求的字节。您应检查Stream.Read()
的返回值,并继续读取读取的字节数是否少于请求的数量。
看到这个问题&amp;回答细节:Creating a byte array from a stream