错误:尝试在ASP.NET中打开PDF时

时间:2009-06-18 15:14:49

标签: asp.net pdf

在我的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);

我得到的错误

“打开此文档时出错。文件已损坏,无法打开”

3 个答案:

答案 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