如何在新的浏览器窗口中编写Outputstream?
目前,我有以下代码。显然它会在同一个窗口中打开流。我知道我可以将 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();
}
答案 0 :(得分:1)
请求文件的链接需要指定您想要一个新的浏览器窗口。
<a href="/path/to/file" target="_blank">PDF</a>
一旦请求被发送到服务器,服务器只会响应结果将其放入请求它的窗口中,除非您指定了不同的目标。显然将其更改为附件会提示下载,但您知道并希望避免它。
其他解决方案是编写一个响应,使用一些javascript打开一个新窗口并执行实际请求来获取数据。如果您知道在新窗口中总是想要它,我认为更改链接以指定新窗口是更好的解决方案。
答案 1 :(得分:1)
服务器无法单独执行 ...
服务器仅响应请求,客户端在其认为合适时显示/使用这些响应。
您需要在客户端通过让客户端在新的浏览器窗口中请求此PDF文件(或其他内容)来更改应用程序的流程。这可以简单地完成,例如,如果当前在用户点击链接后发送PDF,则在a元素中添加target ='some_window_name'属性。
换句话说,到服务器收到请求时,为响应更改“目标”为时已晚(*)。因此,我们的想法是让客户端从新浏览器窗口发出请求。
(*)太晚了...
好吧......也许不是,有人可能会找到一种巧妙的方法来包装响应,其中包含一些javascript enveloppe,它会打开一个新的浏览器窗口,并以某种方式(?)用PDF内容填充其内容。或许还有其他一些技巧......无论如何,这可能会有点人为......(与浏览器在正确的背景下提出要求相比)
答案 2 :(得分:0)
文件是作为回发的一部分生成的吗?如果是这样的话很棘手;您最好的选择可能是将Content-Disposition
更改为attachment
,这会提示用户使用“打开/保存”对话框而不是显示文件。如果没有,在链接中使用target="_blank"
就是解决方案。
答案 3 :(得分:-1)
在您生成文件的地方,您可以使用此代码在新窗口中打开本地文件
Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = outputPdfFile;
process.Start();