2009-01-27 57 views
2

我有一个PDF的URL,我想将PDF提供给我的页面查看器。将PDF流式传输到网页失败

我可以成功(我认为)检索PDF文件。然后,当我做Response.BinaryWrite()我得到一个“文件已损坏,无法修复”的错误从Adobe阅读器。

下面的代码,我有:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      byte[] output = DoWork("Http://localhost/test.pdf"); 
      Response.Clear(); 
      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition", "inline; filename=MyPDF.PDF"); 
      Response.AddHeader("content-length", output.Length.ToString()); 
      Response.BinaryWrite(output); 
      Response.End(); 
     } 
    } 

    public byte[] DoWork(string requestUrl) 
    { 
     byte[] responseData; 
     HttpWebRequest req = null; 
     HttpWebResponse resp = null; 
     StreamReader strmReader = null; 

     try 
     { 
      req = (HttpWebRequest)WebRequest.Create(requestUrl); 

      using (resp = (HttpWebResponse)req.GetResponse()) 
      { 
       byte[] buffer = new byte[resp.ContentLength]; 
       BinaryReader reader = new BinaryReader(resp.GetResponseStream()); 
       reader.Read(buffer, 0, buffer.Length); 
       responseData = buffer; 
      } 
     } 
     finally 
     { 
      if (req != null) 
      { 
       req = null; 
      } 

      if (resp != null) 
      { 
       resp.Close(); 
       resp = null; 
      } 
     } 

     return responseData; 

    } 
+0

你能使用它这个,我的意思是让浏览器(或wget的)做的工作下载? – falstro 2009-01-27 15:41:05

回答

0

尝试刷新二进制文件写入后的反应...

Response.BinaryWrite(output); 
Response.Flush(); 
Response.End(); 

或者,而不是在线,尝试输出的PDF作为附件:

Response.AddHeader("Content-Disposition", "attachment;filename=MyPDF.PDF"); 
+0

Flush不是BinaryReader上的方法 – 2009-01-27 15:39:43

+0

根据MSDN将其替换为Close:刷新流将不会刷新其底层编码器,除非您明确调用Flush或Close。 – sduplooy 2009-01-27 15:40:55

1

尝试将结果文件保存到磁盘。然后用文本编辑器打开文件。也许在脚本/源文件中有一些错误。

3

显然,我需要使用ReadBytes()出于某种原因,从URL读取PDF时,您不会获得所有请求的字节。

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      byte[] output = DoWork("Http://localhost/test.pdf"); 
      Response.Clear(); 
      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition", "attachment"); 
      Response.AddHeader("content-length", output.Length.ToString()); 
      Response.BinaryWrite(output); 
      Response.End(); 
     } 
    } 

    public byte[] DoWork(string requestUrl) 
    { 
     byte[] responseData; 
     HttpWebRequest req = null; 
     HttpWebResponse resp = null; 
     StreamReader strmReader = null; 

     try 
     { 
      req = (HttpWebRequest)WebRequest.Create(requestUrl); 

      using (resp = (HttpWebResponse)req.GetResponse()) 
      { 
       byte[] buffer = new byte[resp.ContentLength]; 
       using (BinaryReader reader = new BinaryReader(resp.GetResponseStream())) 
       { 
        buffer = reader.ReadBytes(buffer.Length); 
        reader.Close(); 
       } 
       responseData = buffer; 
      } 
     } 
     finally 
     { 
      if (req != null) 
      { 
       req = null; 
      } 

      if (resp != null) 
      { 
       resp.Close(); 
       resp = null; 
      } 
     } 

     return responseData; 

    } 
0

当我这样做在Perl一天(作为一个快速黑客对我们的内联网),脚本的症结是:

binmode(STDOUT); 
print "Content-type: application/pdf\n\n"; 
binmode(FILE); 
print <FILE>; 
close(FILE); 

的关键点是要确保输入输出流处于二进制模式,即如您发现的那样,PDF需要在整个链中解释为二进制数据。

1

您也可以尝试使用的FileStream的读取文件

string strPath = Request.PhysicalApplicationPath 
        + "\\document\\Test.pdf"; 
FileStream fStream = new FileStream 
      (strPath, FileMode.Open, FileAccess.Read); 
StreamReader sReader = new StreamReader(fStream); 
相关问题