【问题标题】:Binary Write using ASP.NET into a new tab / window使用 ASP.NET 将二进制写入新选项卡/窗口
【发布时间】:2014-08-23 12:39:09
【问题描述】:

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

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

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

必须有一些我可以设置的东西,这会导致它在新窗口中写入二进制 PDF。像 Response.Target = "_blank" ?????

【问题讨论】:

  • “target”在客户端的“a”标签中定义。如果您可以从服务器端命令定位客户端窗口,那将是一个严重的安全警告。
  • ""target" 在客户端的 "a" 标记中定义。如果您可以从服务器端命令定位客户端窗口,这将是一个严重的安全警告。我不明白这是怎么回事,因为我可以选择流式传输到 PDF 文件(我可以这样做)或浏览器窗口(我可以这样做),我确信 ContentType 有一个选项可以将其设置为尝试在新标签页中打开。

标签: asp.net vb.net visual-studio-2012 response contenttype


【解决方案1】:

换个方法怎么样?向浏览器写入一些客户端脚本以打开一个新窗口/标签。

ClientScript.RegisterStartupScript(this.GetType(), "scriptkey", "window.open('MyPDFDisplayer.ashx');");

然后创建一个新的generic handlerMyPDFDisplayer.ashx 将PDF 写入窗口。

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

我是 C# 人,所以你必须翻译,但应该很容易。

【讨论】:

    【解决方案2】:

    首先,创建一个名为“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
    

    这应该会产生您想要的结果。 :)

    【讨论】:

    • 我认为会有更简单的方法来做到这一点,但我想这是唯一的方法。谢谢。
    • @MikeR。 PDF.aspx 应该是通用处理程序 (PDF.ashx),因为您不需要整个页面的开销。
    • @WyattTroutman 没问题。通用处理程序对于从数据库中获取文档或图像或其他二进制文件非常有用。您甚至可以使用它们来提供静态(常规文件)并将它们用于授权或下载统计信息等。我看到的通用处理程序最常见的用途之一是从数据库中检索图像以显示在 GridView 中,图像 id 为通过查询字符串传递。
    【解决方案3】:

    我知道这已经过时了,但这就是我为实现 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,然后在用户单击该附件时在新选项卡中打开。) em> 并且它们都在上面代码的第 3 行。

    改变这个

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

    到此

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

    如果您将 Content-Disposition 指定为 "Inline",它将在当前窗口中输出文件内容。

    您需要将该配置更改为 "attachment" 并确保您的扩展后缀明确设置为 .pdf。

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      相关资源
      最近更新 更多