2011-09-14 9 views
2

私はDWRでSpringを使用しています。私は応答としてファイルオブジェクトを返したいと思いますが、サーバーの一時的な場所にファイルを保存してから、クライアント側のアンカータグのhrefとしてその場所を送信しますが、サーバに一時的に保存することなく、レスポンスオブジェクトのブラウザに直接ファイルすることができます。サーバ上のファイルを保存せずにサーバレスポンスにファイルオブジェクトを書き込む方法は?

DWR経由でファイルを返信する方法があると予想しました。

答えて

4
 
public ModelAndView writeFileContentInResponse(HttpServletRequest request, HttpServletResponse response) throws IOException { 

     FileInputStream inputStream = new FileInputStream("FileInputStreamDemo.java"); //read the file 

     response.setHeader("Content-Disposition","attachment; filename=test.txt"); 
     try { 
      int c; 
      while ((c = inputStream.read()) != -1) { 
      response.getWriter().write(c); 
      } 
     } finally { 
      if (inputStream != null) 
       inputStream.close(); 
       response.getWriter().close(); 
     } 

     } 
+0

しかし、もう一度新しいFileInputStream( "FileInputStreamDemo.java");保存されたファイルが必要です....私がしたいのは、応答ストリームにデータを書き込むのではなく、どこにでもファイルを作成しないことです。それは何とかできますか? – Sankalp

+1

レスポンスの内容が動的(文字列)の場合は、コンテンツをByteArrayInputStreamに入れ、レスポンス>ライターのチャンクにチャンクで書き込みます。 – Pokuri

+0

新しいFileInputStream( "FileInputStreamDemo。Java ");サーバーの一時的な場所から保存されたファイルを読み取るために使用されます – Rupok

0

私は春を使い始めてから数年が経ちましたが、私はDWRには慣れていませんが、質問の本質はウェブの基本です。

答えははいです。実際には、HTTPヘッダーContent-Disposition: attachmentを設定し、内容をストリーミングする必要があります。このすべては、(リンクを返送するのではなく)元の要求に対する応答になります。

これを達成するための実際のコードは、状況によって異なりますが、これを開始する必要があります。

+0

DWRは、直接ウェブリモーティングでありますサーバー上でメソッドを呼び出すだけで、応答が返されます。応答としてファイルを送信する方法があれば、私は期待しました。 – Sankalp

0

あなたはJava Scriptのメソッドを呼び出しますか?私はSpringがこの流れでどのように関連しているかを実際には理解していませんでしたが、DWRではJava Script Stubを生成し、公開されたBeanのJavaメソッドをJavaスクリプトクライアントコードからサーバー上で直接呼び出すことができます。

実際にバイト配列を返す限り、ファイルをバイト単位で読み取り、javaメソッドから返すことができます。 しかし、あなたはこのバイト配列をクライアント上でどうしますか?

DWRを使用しないでください。オーダーAJAXリクエストを発行してください(DWRが何らかの形で便宜をはたくことができれば - 素晴らしい)。このリクエストはDWRServletに来るべきではなく、Spring MVCのような通常のサーブレット/ Webベースのフレームワークによって処理されるべきです。 リクエストがサーブレットに来たら、

response.setHeader( "Content- 「添付ファイル;ファイル名= test.txt」);

がすでに述べられています。

希望すると、 幸運! マーク

+0

絶対に正しいマーク、私はjsで呼び出すと春はそれとは独立していますそして、あなたがAJAXの送信要求を受け取っても、DWRコールは必要ありません。うまくいきます。あなたが「あなたはバイト単位でファイルを読むことができます。 "いいえ、私はそれを保存せずに応答を除いて任意のファイルを書きたいとは思わない。 – Sankalp

+1

いいえ、私はちょうど私のexlanationを表現することができると思う:)私はあなたが_read_サーバーのファイルbean DWRによって公開されています:class MyBean {byte [] f(){return read( "file.txt"}} - これはファイルをJavaスクリプト側に送信しますが、私にとっては、これは解決策ではありません。これは私が言っていることです。とにかく、私は、Ajax w DWRがなくてもここに行くことができます。 –

+1

サーバ上でファイルを保存したくない場合は、実際にはそうする必要はありません。一度メモリにバイトストリームがあれば、それをクライアントに送ることができ、ハードディスクに保存する必要はありません。あなたがをファイルに送るのではなく、ファイルを直接送信するというのがそのトリックです。ブラウザが添付ファイルを見ると、このファイル/オファーを処理するためのプログラムを開いてダウンロードします)この方法では、ファイルはサーバーに保存されません。 –

-1

クライアントからダウンロードするために、Excelを返す例:

// Java側:

public FileTransfer getExcel(Parametros param){ 
    byte[] result = <here get data>; 
    InputStream myInputStream = new ByteArrayInputStream(result); 
    String excelFormat = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    FileTransfer dwrExcelFile = new FileTransfer("excel.xlsx", excelFormat, myInputStream); 
    return dwrExcelFile; 
} 

が// Javascriptの側:

function downloadExcelFile() { 
    dwr.engine.setTimeout(59000); 
    var params = <params_to_send>; 
    <Java_class>.getExcel(params, {callback:function(dataFromServer) { 
    downloadExcelCallback(dataFromServer); 
    }}); 
} 

function downloadExcelCallback(data) { 
    dwr.engine.openInDownload(data); 
} 
関連する問題