2011-10-19 17 views
1

私は、(おそらくバイナリ)ファイル(例:イメージ)を指すURLを取るフィールドを持つHTMLフォームを持っています。 urlは、サーバーが到達できないローカルリソースを指すことができるので、クライアントがフェッチする必要があります。URLで指定されたドキュメントをバイト配列にアップロードする

このフェッチの結果を(HTTP POSTリクエストを介して)Javaサーブレットにアップロードし、それをバイトの配列に入れたいと思います。これは低レベルの表現なので、ApacheのFileUploadを使うべきかどうかはわかりません。

私を混乱させるもう一つの点は、FileUploadのFileItemOutputStreamを提供しています。私はInputStreamがファイルを読むことを期待していました。

私はFileUploadを勉強した後に立ち往生しています。私は、Webアプリケーションの開発に関する私の基本的な知識が不足している可能性があります。

この機能はどのように構築する必要がありますか?私はJava開発のこのコーナーに慣れています(私の一般的な(つまりSE)Javaスキルは非常に優れていますが)。

+0

バイナリファイルをダウンロードしてディスクに保存し、ファイル入力を使用してディスク上のファイルの場所を選択し、ファイルをアップロードする必要があります。 AFAIKという方法はありませんが、自動的にURLのコンテンツをサーバーに転送します。 URLを送信するだけで、サーバーはURL自体にアクセスしてイメージをダウンロードする必要があります。 –

+0

@JBNizet実際には私の質問はサーブレットを書くことでした。フロントエンドの取得は別の(興味深い)ポイントで、私が質問を投稿するかもしれません。フロントエンドについてではなく、サーブレットに関することを明確にするために質問を更新しました。 – Rinke

答えて

1

そのままFileUploadを使用してください。自分で再作成しないでください。これは時間の無駄です。

FileItemにはOutputStreamしかないと思われる理由がわかりません。また、getInputStream()メソッドもあります。 ByteArrayOutputStreamに書き込んでください。

InputStream input = fileItem.getInputStream(); 
ByteArrayOutputStream output = new ByteArrayOutputStream(); 
IOUtils.copy(input, output); 
byte[] bytes = output.toByteArray(); 
// ... 

あなただけの同じ時刻にファイルをアップロードするユーザーの多くが存在する場合、これはサーバーのメモリ使用量を爆発する可能性があることに注意してくださいする必要があります。バイト配列の各バイトは、1バイトのJVMのメモリを消費します。 10MBのファイルをアップロードする100人の同時ユーザーがいるとしたら、1GBのサーバーメモリが無駄になります。

+0

あなたは 'getInputStream'について本当に正しいです。私はちょうどそのように実装しました。どうやら私はうんざりでした。私の質問は今やばかげているようだ。ご回答有難うございます。 – Rinke

+0

ようこそ。 – BalusC

0

正しく理解すれば、サーブレットでHTTP経由でアップロードされたファイルを受け取ろうとしていますか?ネットでそれを行う方法の例はたくさんあります(例:http://www.servlets.com/jservlet2/examples/ch04/UploadTest.java

あなたの質問には何か不足していますか?

+0

ポイントは、それをバイトの配列に取得しています。利用可能な実装があるので、最初からそのようなものを構築することはおそらく賢明ではありません(RFC 1867を実装したい場合)。私の問題は、(例えば)Apache FileUploadでバイト配列を取得する方法がわかりません。私がEEの開発に経験したことはないので、単に私が何かを見落としたり誤解している可能性があります。 – Rinke

+0

私はあなたにリンクしている例で、この 'File f = multi.getFile(name);'のようなFileオブジェクトを取得すると、InputStreamを取得してバイト配列に読み込むことができます。 – Thor84no

関連する問題