GWTのFileUploadウィジェットを使用して1つのファイルをアップロードする方法を見つけようとしています。 JavaでGWTとGoogle AppEngineを使用していますが、自分のLinuxサーバーにファイルをアップロードしたいと思います。次のコードは既にありますが、送信方法がわかりませんファイルをGoogle AppServerサーバーに保存し、別のサーバーに保存します。
public class FileUploader{
private ControlPanel cp;
private FormPanel form = new FormPanel();
private FileUpload fu = new FileUpload();
public FileUploader(ControlPanel cp) {
this.cp = cp;
this.cp.setPrimaryArea(getFileUploaderWidget());
}
@SuppressWarnings("deprecation")
public Widget getFileUploaderWidget() {
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
// form.setAction(/* WHAT SHOULD I PUT HERE */);
VerticalPanel holder = new VerticalPanel();
fu.setName("upload");
holder.add(fu);
holder.add(new Button("Submit", new ClickHandler() {
public void onClick(ClickEvent event) {
GWT.log("You selected: " + fu.getFilename(), null);
form.submit();
}
}));
form.addSubmitHandler(new FormPanel.SubmitHandler() {
public void onSubmit(SubmitEvent event) {
if (!"".equalsIgnoreCase(fu.getFilename())) {
GWT.log("UPLOADING FILE????", null);
// NOW WHAT????
}
else{
event.cancel(); // cancel the event
}
}
});
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
public void onSubmitComplete(SubmitCompleteEvent event) {
Window.alert(event.getResults());
}
});
form.add(holder);
return form;
}
}
さて、次に何をする必要がありますか? web.xmlに何を入れる必要がありますか?ファイルを保存してそのオブジェクトのURLを返すことができるようにサーブレットを書くにはどうすればよいですか(可能であれば)
私のアプリのコードは次のとおりです。
1)HTTPリクエストを受け入れるクラスを作成しました:
import Java.io.ByteArrayOutputStream;
import Java.io.IOException;
import Java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.Apache.commons.fileupload.FileItemIterator;
import org.Apache.commons.fileupload.FileItemStream;
import org.Apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUpload extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletFileUpload upload = new ServletFileUpload();
try{
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
// Process the input stream
ByteArrayOutputStream out = new ByteArrayOutputStream();
int len;
byte[] buffer = new byte[8192];
while ((len = stream.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, len);
}
int maxFileSize = 10*(1024*1024); //10 megs max
if (out.size() > maxFileSize) {
throw new RuntimeException("File is > than " + maxFileSize);
}
}
}
catch(Exception e){
throw new RuntimeException(e);
}
}
}
2)次に、web.xmlに次の行を追加しました。
<servlet>
<servlet-name>fileUploaderServlet</servlet-name>
<servlet-class>com.testapp.server.FileUpload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileUploaderServlet</servlet-name>
<url-pattern>/testapp/fileupload</url-pattern>
</servlet-mapping>
3)そして、form.actionでこれを行いました:
form.setAction(GWT.getModuleBaseURL()+"fileupload");
GWTでは、httpフォームメソッドを使用してファイルをサーバーに投稿できます。また、提供されたHttpServletを使用して、Appengine BigTableでバイナリブログとしてデータを受け入れて保存する必要があります。
次に、2番目のHttpServletがbigtableからファイルを読み取り、HTTPヘッダーのMIMEタイプを設定する{およびキャッシュオプション}が必要です。その後、ファイルをユーザーにストリーミングします。
RPCは必ずしも必要ではありませんが、生成されたfileIdが何であるかをクライアントに知らせて、ユーザーがそれにアクセスできるようにする必要があります{ユーザーにIDを提供させ、名前のオーバーライドを心配させない限り...... ick} 。 rpcを使用して/シングルID {"user by by newest file id"}のリストを要求するか、UploadServletの応答の本文でそのidを返すことができます...しかし、投稿ターゲットを確認する必要がありますはページはめ込みiframeであり、送信イベントと実際のサーバー応答の間にiframeに本文があることを確認するためにポーリングし、gwtでそのIDを解析して使用し、ファイルを使用するimgまたはオブジェクトタグを作成します。
重要な部分は、アップロード用のサーブレットとダウンロード用のサーブレットを用意することです。 BigTableはバイナリBLOBのみを保存するため、入力ファイルから読み取ることができるmime/content Typeを持つデータエンティティも必要です(ファイル拡張子に依存しないでください!}。また、BigTableにはエンティティごとに1MBがあり、無料アカウントには10MBのリクエスト制限があります。データエンティティに1〜10個のBLOBのリストを含めることをお勧めします。各BLOBは最大1024バイトです。
基本的に、あなたの最善の策は、Google File Serviceのような作業用の無料コピーを見つけ、それを拡張してシステムの仕組みを学習することです。
ご希望の場合は、gwtコントロールウィジェットを完成させ、誰にとっても有用であると十分に安定していると判断できれば、ファイル処理の独自のオープンソースバージョンを投稿します。メールx [〜#〜] at [〜#〜] aiyx [〜#〜] dot [〜#〜] jarを送信する場合の情報betaliciousコード。
既に他のフレームワークを使用している場合を除き、プレーンなVanilla GWTとそのネイティブコンポーネントを使用することを強くお勧めします。他のフレームワークを使用すると、アプリケーションのサイズを大幅に拡大できます。
ネイティブコンポーネントの使用は、3つの手順で実行できます。
興味深いことに、GWTの部分が最も簡単です。 GWT Uploadで3つの簡単な手順でコードをコピーできます 必要に応じて。幸せなアップロード!
ここでは、完全な 進行状況バー付きのGWT fileupload
ここでは、[〜#〜] download [〜#〜]ソース