2009-04-13 44 views
2

私はかなり大きなファイル(> 50 MBytes)をクライアントからサーバーにアップロードする必要があるStruts 1 Webアプリケーションを持っています。私は現在、組み込みのorg.apache.struts.upload.DiskMultipartRequestHandlerを使用して、HTTP POSTのmultipart/form-dataリクエストを処理しています。正常に動作していますが、非常に遅く、毎秒約100キロバイトでアップロードされます。Struts遅いアップロードをアップロード

同じ大容量のファイルをサーバーからクライアントにダウンロードすると、10倍以上高速になります。単純なFTPクライアントを使用して同じサーバーにファイルを転送すると、時間の1/3以下しかかからないので、これは私のISPのアップロード速度とダウンロード速度の違いにはならないと思います。

組み込みのDiskMultipartRequestHandlerを新しいorg.apache.commons.fileuploadパッケージに置き換えてみましたが、これを変更してStruts 1が必要とするMultipartRequestHandlerを作成する方法がわかりません。

Barendは、web.xmlに設定できる 'bufferSize'パラメータがあることを以下にコメントしました。バッファのサイズを100 KByteに増やしましたが、パフォーマンスは向上しませんでした。 DiskMultipartRequestHandlerの実装を見ると、マルチパート境界文字を探してストリームを1バイトずつ読み込むため、そのパフォーマンスがの場合はに制限されている可能性があります。

大きなファイルをアップロードするのに誰かがStrutsを使用していますか?

誰かがStruts 1で提供されているデフォルトのDiskMultipartRequestHandlerをカスタマイズしましたか?

大容量のファイルをアップロードする際には、もっと忍耐強くする必要がありますか? :-)

答えて

2

Apache wikiのStrutsFileUploadページには、使用できる設定の束が含まれています。私にとって目立つのは、4096バイトのデフォルトのバッファサイズです。まだアップロードしていない場合は、これをもっと大きなものに設定してみてください(アップロードごとにバッファが割り当てられるので大きすぎない)。 2MBという値は妥当と思われます。私はこれがアップロードレートを大幅に向上させると思う。

+0

これは素晴らしいアイデアです!以前気付かなかったありがとう!残念ながら、私はちょうどそれを試みたが、実際には違いはありませんでした。 –

1

Apache Commonsを使用すると、 ファイルをアップロードする際の柔軟性が向上します。アップロードファイルのサイズ(最大ファイルサイズ)とファイルを交換するための一時的なファイルの場所を設定できます(これによりパフォーマンスが向上します)。 このリンクをご覧くださいhttp://commons.apache.org/fileupload/using.html

+0

この実装はより柔軟性があり、ディスクに保存することを決定する前に、アップロード全体をメモリに保持することさえ可能です。しかし、それは非常に大きなファイル(> 50 MBytes)にどのような影響を与えますか? –

+0

これはディスクに保存する前にファイル全体をメモリにロードしません。これを使用してください。 fileItem.write(destination); – Tony

関連する問題