使用ASP.NET将二进制文件写入新选项卡/窗口

使用ASP.NET将二进制文件写入新选项卡/窗口,asp.net,vb.net,visual-studio-2012,response,contenttype,Asp.net,Vb.net,Visual Studio 2012,Response,Contenttype,我正在使用VB.NET将pdf文件直接写入浏览器,浏览器会立即打开它,替换当前窗口中的内容。我试图做的是设置一个参数,这将导致binarywrite在一个新的选项卡/窗口中 ' Set the appropriate ContentType. Response.ContentType = "Application/pdf" ' Write file directly to browser. Response.BinaryWrite(binaryData) Response.End() 必须有

我正在使用VB.NET将pdf文件直接写入浏览器,浏览器会立即打开它,替换当前窗口中的内容。我试图做的是设置一个参数,这将导致binarywrite在一个新的选项卡/窗口中

' Set the appropriate ContentType.
Response.ContentType = "Application/pdf"

' Write file directly to browser.
Response.BinaryWrite(binaryData)
Response.End()

必须有一些东西,我可以设置,这将导致写在一个新的窗口二进制PDF文件。类似于响应。Target=“\u blank”

另一种选择怎么样?向浏览器写入一些客户端脚本以打开新窗口/选项卡

ClientScript.RegisterStartupScript(this.GetType(), "scriptkey", "window.open('MyPDFDisplayer.ashx');");
然后创建一个新的MyPDFDisplayer.ashx,将PDF写入窗口

context.Response.ContentType = "application/pdf";
context.Response.BinaryWrite(binaryData);
context.Response.End();

我是一个C#guy,所以你必须翻译,但应该很简单。

首先,创建一个名为“PDF.aspx”的附加页面或任何你想要的页面

其次,在页面中,将“binarydata”变量存储在会话中

Session("binaryData") = binarydata
告诉它转到你的新页面

Response.Redirect("PDF.aspx")
第三,转到您的PDF.aspx代码隐藏页面,并放置以下内容:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles       Me.Load
    Try
         Response.ContentType = "Application/pdf"
         Response.BinaryWrite(Session("binaryData"))
         Response.End()
    Catch ex As Exception
        Throw ex
    End Try
End Sub

这将产生您想要的结果。:)

我知道这很古老,但以下是我为实现OP所做的工作。(请原谅,这是C#但转换它应该不会太难)

这是我使用的原始代码,它显示了与您描述的相同的行为

Response.ClearContent();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "inline; filename=" + docName);
Response.AddHeader("Content-Length", byteArray.Length.ToString());
Response.BinaryWrite(byteArray);
Response.End();
有两个关键的改变,我必须让它以我想要的方式工作(下载文件为PDF,然后在用户点击附件时打开一个新的选项卡。)它们都在上面代码的第3行

更改此设置

Response.AddHeader("Content-Disposition", "inline; filename=" + docName);
Response.AddHeader("Content-Disposition", "attachment; filename=" + docName + ".pdf");
到此

Response.AddHeader("Content-Disposition", "inline; filename=" + docName);
Response.AddHeader("Content-Disposition", "attachment; filename=" + docName + ".pdf");
如果将内容配置指定为“内联”,则它将在当前窗口中输出文件内容


您需要将该配置更改为“附件”,并确保扩展后缀显式设置为.pdf。

在“a”标记中的客户端定义了“目标”。如果您可以从服务器端命令指向客户端窗口,这将是一个严重的安全警告。“target”在“a”标记中定义为客户端。如果您可以从服务器端命令指向客户端窗口,这将是一个严重的安全警告。“我不明白这是怎么回事,因为我可以选择流式传输到PDF文件(我可以这样做),或者浏览器窗口(我可以这样做),我确信ContentType有一个选项可以将其设置为尝试在新选项卡中打开。我认为有一种更简单的方法可以做到这一点,但我想这是唯一的方法。谢谢你。aspx应该是一个通用处理程序(PDF.ashx),因为您不需要整个页面的开销。@WyattTroutman没问题。通用处理程序对于从数据库获取文档、图像或其他二进制文件非常有用。您甚至可以使用它们来服务静态文件(常规文件),并将其用于授权或下载统计数据等。我看到的通用处理程序最常见的用途之一是从数据库检索图像以显示在GridView中,图像id通过查询字符串传递。