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'属性を追加することで、これを簡単に行うことができます。

つまり、サーバーがリクエストを受信するまでには、レスポンスの「宛先」を変更するには遅すぎます (*)。したがって、クライアントに新しいブラウザウィンドウからの/に対するリクエストを行わせるという考えです。

(*) 遅すぎる...
まあ...多分そうではないかもしれませんが、誰かが新しいブラウザウィンドウを開き、どういうわけか (?) そのコンテンツを PDF コンテンツで準備する JavaScript エンベロープで応答をラップする賢い方法を見つけるかもしれません。または、他のトリックかもしれません...とにかく、これは多少不自然になる可能性があります...(ブラウザが正しいコンテキストでそれを要求するだけと比較して)

于 2009-10-07T14:43:22.867 に答える
-1

ファイルを生成した場所で、このコードを使用してローカル ファイルを新しいウィンドウで開くことができます

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