2011-03-07 23 views
1

ダウンロードボタンをクリックしたユーザーのためにpdfファイルを開く必要があります。ファイルを作成せずにAJAX呼び出しを使用してBLOBとして出力されたPDFファイルの内容を出力

ダウンロードボタンは、PDFコンテンツを含むデータベースのblobフィールドからデータを取得し、それを応答として返すサーブレットにajax呼び出しを行います。

回答をPDFファイルとしてユーザーにダウンロードさせるには、どうすればよいですか。

サーブレットのコードは以下の通りです:

   response.setContentType("application/pdf"); 
       oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF"); 
       byte[] bytes = blob.getBytes(1, (int) blob.length()); 
       ServletOutputStream servletOutputStream = response.getOutputStream(); 
       servletOutputStream.write(bytes, 0, bytes.length); 
       servletOutputStream.flush(); 
       servletOutputStream.close(); 

私は、応答のために火のバグを確認AJAXで下記のような文字を含む長い応答を受け取ります。

a J 㔎 ji 2K y 2 q 9 G !% kɂ W mp){h̕ S NJ_ A ' 2k j яR >wB e | =w p %w qǦ> 〜 1o 㾙9j B ;aNx3 ;;;;;;;;;;;;;;;;;; fM6K

私はページを提出するか、URLに

を示すクエリに対して送信されたパラメータでサーブレットのウィンドウをポップアップする必要はありません

私はまた、サーバー上のファイルを作成する必要はありません。

AJAX呼び出しに来たサーブレットの応答を取り、ページまたはインラインフレームおよびそれをブラウザに表示する方法はありますファイルを自動的にダウンロードします...

答えて

2

Ajaxを使用してファイルをダウンロードすることはできません。しかし、隠されたIFRAMEを使用して同じ「効果」を達成することができます。 XMLHttpRequestを使用する代わりに、非表示のiframeを動的に作成し、適切なパラメータを使用してサーブレットに送信します。レスポンスが来ると、ブラウザはcontent-type/extensionに基づいてコンテンツを自動的に処理します。 jQueryを使用している場合、this pluginにはこの機能が組み込まれています。

+0

'document.getElementById( 'myform_1')。target = 'content_frame';フォームを提出するとトリックをしました.... –

0

Rahulmohanのようなサウンドは彼のことを知っていますが、ファイル名ヘッダーをレスポンスストリームに追加しようとする価値があります。私は、Ajax環境でasp.netではないが類似何かをし、自分のコードとあなたの唯一の違いは、この行です:

Response.AddHeader(「のContent-処分」、「添付ファイル;ファイル名=」&ファイル名& ".pdf")

私のページはAjax環境では動作しません。

+0

HTTP仕様に従って、ブラウザは応答コンテンツタイプに基づいて応答を処理することになっています。しかし、他の仕様と同様に、彼らは手紙に従わない。たとえば、IEはコンテンツの種類ではなく、ファイルの拡張子に基づいてコンテンツを処理します。さまざまなブラウザでいくつか試行錯誤した結果、適切な拡張子を持つファイル名と適切なコンテンツタイプの両方を使用することが最善の方法であることがわかりました。しかし、以前のようにiframeを使用する必要があります。 – rahulmohan

+0

私はあなたが正しいことを疑うことはありませんRahulmohanが、私はあなたの提案に従うことを確信していない、私は将来私はあなたに次々としていることを確認したいと思います。応答ストリームに出力を書き込むページをホストしている非表示のiFrameを作成し、書き込むファイルのパラメータを含むURLを投稿して更新しますか? – Mordy

関連する問題