2011-09-13 7 views
0

JavaクライアントからTomcatで実行されているサーブレットにHttp出力ストリームを介して非常に大きなファイル(> 200MB)を送信しようとしています。HTTP出力ストリームを使用して複数のオブジェクトを送信する必要があります

私のプロトコルは現在byte[]でファイルの内容をパッケージ化し、それはいくつかのメタデータ(ファイル名など)、「標準」キーの下の各パート("FILENAME"とともにAA Map<String, Object>を置いている - >"Foo""CONTENTS" - >byte[]"USERID" - >1234など)。 Mapは、URL接続出力ストリーム(urlConnection.getOutputStream())に書き込まれます。これは、ファイルの内容が小さい場合(< 25MB)、ファイルサイズが非常に大きい場合にTomcatメモリの問題(OutOfMemoryError)を実行しているときにうまく動作します。

最初にメタデータMapを送信した後、ファイルの内容を送信し、最後にファイルのデータのチェックサムを送信すると考えました。受信側サーブレットは入力ストリームからメタデータを読み取り、ファイル全体が終了するまでバイトを読み取り、最後にチェックサムを読み取ります。

接続ヘッダーでメタデータを送信する方が良いでしょうか?もしそうなら、どうですか?最初にソケットの下にメタデータを送信し、その後にファイルの内容を送信すると、これを行うための標準プロトコルがありますか?

答えて

2

ほとんどの場合、サーバーにデータを送信するには、確かにmultipart POSTを使用します。その後、サーバー上でcommons-fileuploadのようなものを使用してアップロードを処理することができます。

commons-fileuploadの良い点は、大容量のファイルをバッファするのに十分なメモリがサーバにないことを理解していて、アップロードされたデータを一定のサイズを超えるとディスクに自動的に流し込みます。タイプの問題。

それ以外の場合は、自分で比較できるものを実装する必要があります。サーバーが1)アップロードを解析し、2)データをファイルにリダイレクトして、要求全体をメモリにバッファリングする必要がない限り、データをパッケージ化して送信する方法を大幅に変えることはありませんすぐに。あなたがcommons-fileuploadを使っているなら、言及したように、これらの両方が無料になるので、間違いなく私がお勧めするものです。

+0

私はこれがまさに私が必要と考えるものです。私は調査します。ありがとう。 – Ralph

0

私はあなたに直接答えはありませんが、代わりにFTPを使用することを検討することもできます。 Apache MinaはFTPLetsを提供します.FTPLetsは基本的にFTPイベントに応答するサーブレットです(詳細はhttp://mina.apache.org/ftpserver/ftplet.htmlを参照)。

これにより、メモリ内のデータ全体を受信側で受信する必要なく、任意の形式でデータをプッシュできます。

よろしくお願いいたします。

関連する問題