将PDF流式传输到网页失败
我有一个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;
}
尝试刷新二进制文件写入后的反应...
Response.BinaryWrite(output);
Response.Flush();
Response.End();
或者,而不是在线,尝试输出的PDF作为附件:
Response.AddHeader("Content-Disposition", "attachment;filename=MyPDF.PDF");
Flush不是BinaryReader上的方法 – 2009-01-27 15:39:43
根据MSDN将其替换为Close:刷新流将不会刷新其底层编码器,除非您明确调用Flush或Close。 – sduplooy 2009-01-27 15:40:55
尝试将结果文件保存到磁盘。然后用文本编辑器打开文件。也许在脚本/源文件中有一些错误。
显然,我需要使用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;
}
当我这样做在Perl一天(作为一个快速黑客对我们的内联网),脚本的症结是:
binmode(STDOUT);
print "Content-type: application/pdf\n\n";
binmode(FILE);
print <FILE>;
close(FILE);
的关键点是要确保输入和输出流处于二进制模式,即如您发现的那样,PDF需要在整个链中解释为二进制数据。
您也可以尝试使用的FileStream的读取文件
string strPath = Request.PhysicalApplicationPath
+ "\\document\\Test.pdf";
FileStream fStream = new FileStream
(strPath, FileMode.Open, FileAccess.Read);
StreamReader sReader = new StreamReader(fStream);
你能使用它这个,我的意思是让浏览器(或wget的)做的工作下载? – falstro 2009-01-27 15:41:05