代码之家  ›  专栏  ›  技术社区  ›  Rick Kierner

将PDF流式传输到网页失败

  •  2
  • Rick Kierner  · 技术社区  · 16 年前

    我有一个pdf的url,我想把pdf提供给我的页面查看器。

    我想我能成功地检索到pdf文件。然后,当我执行response.binarywrite()时,Adobe Reader会出现一个“文件已损坏,无法修复”的错误。

    这是我的密码:

    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;
    
        }
    
    6 回复  |  直到 15 年前
        1
  •  3
  •   Rick Kierner    16 年前

    显然,我需要使用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;
    
        }
    
        2
  •  1
  •   Bouke    16 年前

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

        3
  •  1
  •   Eduardo Molteni    15 年前

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

     string strPath = Request.PhysicalApplicationPath 
                      + "\\document\\Test.pdf";
     FileStream fStream = new FileStream
                (strPath, FileMode.Open, FileAccess.Read);
     StreamReader sReader = new StreamReader(fStream);
    
        4
  •  0
  •   sduplooy    16 年前

    尝试在二进制写入后刷新响应…

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

    或者,尝试将PDF作为附件输出,而不是内联:

    Response.AddHeader("Content-Disposition", "attachment;filename=MyPDF.PDF");
    
        5
  •  0
  •   Nick    16 年前

    前几天我在Perl中做这个的时候 乱劈 对于我们的内部网),脚本的关键是:

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

    关键是确保输入 输出流是二进制模式,也就是说,正如您所发现的,pdf需要被解释为整个链中的二进制数据。

        6
  •  0
  •   a7drew    16 年前

    通过使用webclient类,您可以简化代码

    Here's the MSDN documentation. 它不像低级httpwebrequest类那么麻烦。