2

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

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

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();
  }
4

4 回答 4

1

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

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

将请求发送到服务器后,服务器只需将结果返回到请求它的窗口中,除非您指定了不同的目标。显然将其更改为附件会提示下载,但您知道并希望避免它。

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

于 2009-10-07T14:42:33.353 回答
1

服务器不能单独做到这一点......

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

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

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

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

于 2009-10-07T14:43:22.867 回答
0

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

于 2009-10-07T14:49:25.990 回答
-1

在您生成文件的地方,您可以使用此代码在新窗口中打开本地文件

Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = outputPdfFile;
process.Start();
于 2013-12-13T03:25:38.670 回答