web-dev-qa-db-ja.com

GWTでの基本的なファイルのアップロード

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を返すことができるようにサーブレットを書くにはどうすればよいですか(可能であれば)

45
Maksim

私のアプリのコードは次のとおりです。

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");
57
KevMo

GWTUpload を使用することをお勧めします。使用および拡張が非常に簡単だからです。 10分未満でプロジェクトに追加でき、すぐにGAEをサポートします(GWTUpload-GAEを使用)。一般的な使用シナリオについては、 examples をご覧ください。

11
rluba

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があり、無料アカウントには10​​MBのリクエスト制限があります。データエンティティに1〜10個のBLOBのリストを含めることをお勧めします。各BLOBは最大1024バイトです。

基本的に、あなたの最善の策は、Google File Serviceのような作業用の無料コピーを見つけ、それを拡張してシステムの仕組みを学習することです。

ご希望の場合は、gwtコントロールウィジェットを完成させ、誰にとっても有用であると十分に安定していると判断できれば、ファイル処理の独自のオープンソースバージョンを投稿します。メールx [〜#〜] at [〜#〜] aiyx [〜#〜] dot [〜#〜] jarを送信する場合の情報betaliciousコード。

5
Alyxandor

既に他のフレームワークを使用している場合を除き、プレーンなVanilla GWTとそのネイティブコンポーネントを使用することを強くお勧めします。他のフレームワークを使用すると、アプリケーションのサイズを大幅に拡大できます。

ネイティブコンポーネントの使用は、3つの手順で実行できます。

  1. ファイルアップロードサーブレットを作成する
  2. Web.xmlを変更する
  3. GWTアップロードフォームを作成する

興味深いことに、GWTの部分が最も簡単です。 GWT Uploadで3つの簡単な手順でコードをコピーできます 必要に応じて。幸せなアップロード!

2
Jeff Richley

ここでは、完全な 進行状況バー付きのGWT fileupload

enter image description here

ここでは、[〜#〜] download [〜#〜]ソース

1
Suresh Atta