有谁能请告诉我如何将pdf流式传输到新的标签浏览器?我只是在内存上有pdf流,当我点击链接在新标签页或窗口浏览器中显示PDF时我想要。 我怎么能这样做? 谢谢!
我有这个链接:
<a id="hrefPdf" runat="server" href="#" target="_blank"><asp:Literal ID="PdfName" runat="server"></asp:Literal></a>
在我的代码背后,我在onload事件中有这个:
Stream pdf= getPdf
if (pdf != null)
{
SetLinkPDF(pdf);
}
private void SetLinkPDF(IFile pdf)
{
hrefPdf.href = "MyPDF to the Browser"
PdfName.Text = pdf.PdfName;
}
我必须处理流pdf(IFile包含PDF的名称,流,元数据等)
如果我点击在新浏览器上显示流,我该怎么办?
我有另一个问题,是OnClientClick =“aspnetForm.target ='_ blank';” timbck2建议我。我必须在新窗口中打开文件(图像或pdf),我该怎么办?不工作这个。谢谢!
Timbbck2我的asp代码是:
<asp:LinkButton runat="server" ID="LinkButtonFile" OnClick="LinkButtonFile_Click" OnClientClick="aspnetForm.target = '_blank';"></asp:LinkButton>
感谢!!!
答案 0 :(得分:12)
我是从磁盘上的文件中完成此操作的 - 从内存流中发送数据应该不会有太大的不同。除了数据本身之外,您还需要向浏览器提供两个元数据。首先,您需要提供数据的MIME类型(在您的情况下它将是application/pdf
),然后是Content-Length标头中的数据大小(以整数形式),然后自己发送数据。 / p>
总而言之(考虑到你要求的评论和我想的,你的标记看起来像这样:
<asp:LinkButton ID="whatever" runat="server" OnClick="lnkButton_Click"
OnClientClick="aspnetForm.target='_blank';">your link text</aspnet:LinkButton>
你的代码中的这几行C#代码应该可以(或多或少):
protected void lnkButton_Click(object sender, EventArgs e)
{
Response.ClearContent();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "inline; filename=" + docName);
Response.AddHeader("Content-Length", docSize.ToString());
Response.BinaryWrite((byte[])docStream);
Response.End();
}
答案 1 :(得分:1)
要直接在浏览器中显示pdf,您应该将响应的内容类型设置为application/pdf
您的用户还应安装某种pdf阅读器,以便工作。
答案 2 :(得分:0)
你试过Response.BinaryWrite ??您可能也想设置一些标题。
答案 3 :(得分:0)
最佳答案建议首先将流转换(转换)为byte [],然后将文件下载到服务器(来自它来自的任何流),然后将其发送到客户端。
如果您需要提供Stream
作为某些外部服务的参数(例如我的Azure存储),您可以使用以下方法。
public ActionResult Coupons(string file)
{
Response.AddHeader("Content-Disposition", "inline; filename=" + file);
Response.ContentType = "application/pdf";
AzureStorage.DownloadFile(file, Response.OutputStream);//second parameters asks for a 'Stream', you can use whatever stream you want here, just put it in the Response.OutputStream
return new EmptyResult();
}
这将直接将文件传输到客户端(据我所知)。