【问题标题】:Write Outputstream in new window在新窗口中写入输出流
【发布时间】:2010-12-04 15:50:07
【问题描述】:

如何在新的浏览器窗口中编写输出流?

目前,我有以下代码。显然它会在同一个窗口中打开流。我知道我可以将 Outputstream 写入文件并在新窗口中打开它,但这不是一个选项。

protected void openPDF(byte[] dados) {

   HttpContext contexto = HttpContext.Current;

   contexto.Response.Clear();
   contexto.Response.AppendHeader("content-type", "application/pdf");
   contexto.Response.AppendHeader("Expires","Mon, 26 Jul 1990 05:00:00 GMT");
   contexto.Response.AppendHeader("Cache-Control","no-cache, must-revalidate");
   contexto.Response.AppendHeader("Pragma","no-cache");
   contexto.Response.Expires = -1;
   contexto.Response.AppendHeader("Content-Disposition", "inline; filename=labels.pdf");
   contexto.Response.AddHeader("content-length", dados.Length.ToString());
   contexto.Response.OutputStream.Write(dados, 0, dados.Length);
   contexto.Response.OutputStream.Flush();
   contexto.Response.End();
  }

【问题讨论】:

    标签: asp.net html webforms window filestream


    【解决方案1】:

    你已经生成了一个文件,你可以使用这个代码在新窗口中打开一个本地文件

    Process process = new Process();
    process.StartInfo.UseShellExecute = true;
    process.StartInfo.FileName = outputPdfFile;
    process.Start();
    

    【讨论】:

      【解决方案2】:

      服务器无法做到这一点单独...

      服务器只响应请求,客户端显示/使用它认为合适的响应。

      您需要在客户端更改应用程序的流程,让客户端在新的浏览器窗口中请求此 PDF 文件(或其他内容)。这可以很简单地完成,例如,如果 PDF 当前是在用户单击链接后发送的,则通过在 a 元素中添加 target='some_window_name' 属性。

      换句话说,当服务器收到请求时,更改响应的“目标”为时已晚 (*)。所以这个想法是让客户端从/为新的浏览器窗口发出请求。

      (*) 为时已晚...
      好吧......也许不是,有人可能会找到一种巧妙的方法,用一些 javascript 信封包装响应,这将打开一个新的浏览器窗口并以某种方式(?)用 PDF 内容填充其内容。或者可能是其他一些技巧......无论如何,这可能有点做作......(与让浏览器在正确的上下文中请求它相比)

      【讨论】:

        【解决方案3】:

        文件是作为回发的一部分生成的吗?如果是这样,这很棘手;您最好的选择可能是将Content-Disposition 更改为attachment,这将提示用户打开/保存对话框而不是显示文件。如果没有,在链接中使用target="_blank" 是解决方案。

        【讨论】:

        • 基本上,我在 Sharepoint Webpart 上按下一个按钮。 webpart 调用 web 服务返回一个 byte[]。我想要的是将 byte[] (它是一个 pdf 文件)写入一个新窗口,因为在同一个窗口中打开它不是很友好(ish)。
        • 您需要更改 webpart 中的按钮以调用一些 Javascript 来打开一个新窗口。新窗口需要是一个新页面请求,并且您必须在查询字符串中传递调用 Web 服务所需的任何上下文数据。
        【解决方案4】:

        请求文件的链接需要指定你想要一个新的浏览器窗口。

        <a href="/path/to/file" target="_blank">PDF</a>
        

        一旦请求被发送到服务器,服务器会简单地响应结果,将其放入请求它的窗口中,除非您指定了不同的目标。显然将其更改为附件会提示下载,但您知道这一点并希望避免它。

        其他解决方案是编写一个响应,使用一些 javascript 打开一个新窗口并执行实际请求以获取数据。如果你知道你总是希望它在一个新窗口中,我认为更改链接以指定一个新窗口是一个更好的解决方案。

        【讨论】:

          猜你喜欢
          • 2010-11-12
          • 2023-03-24
          • 2011-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-24
          • 2018-10-11
          相关资源
          最近更新 更多