0

ウィジェットを作成し、ルート パネルに直接追加しました

public class FileUploadWidget extends VerticalPanel {
    public FileUploadWidget() {
        super();
        final FormPanel form = new FormPanel();

        form.setMethod(FormPanel.METHOD_POST);
        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        form.setAction("/FileUpload"); 

        form.setWidget(this);

        final FileUpload fileUpload = new FileUpload();

        fileUpload.setName("uploadFormElement");  
        this.add(fileUpload);

        Label maxUpload = new Label();
        maxUpload.setText("Maximum upload file size: 1MB");
        this.add(maxUpload);

        Button button = new Button("Submit");
        button.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                form.submit();

            }
        });
        this.add(button);

        form.addSubmitCompleteHandler(new SubmitCompleteHandler() {

            public void onSubmitComplete(SubmitCompleteEvent event) {
                Window.alert(event.getResults());

            }
        });
    }

}

私はサーブレットを作成しました

public class FileUploadServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

      protected void doPost(HttpServletRequest request, 
    HttpServletResponse response) 
          throws ServletException, IOException { 
        response.setContentType("text/plain"); 

        FileItem uploadItem = getFileItem(request); //BREAKPOINT

        if (uploadItem == null) { 
          response.getWriter().write("NO-SCRIPT-DATA"); 
          return; 
        } 
        try {
            uploadItem.write(new File("newfile.txt"));
        } catch (Exception e) {
            response.getWriter().write("ERROR");
        }

        response.getWriter().write("OK"); 
      } 

      private FileItem getFileItem(HttpServletRequest request) { 
        FileItemFactory factory = new DiskFileItemFactory(); 
        ServletFileUpload upload = new ServletFileUpload(factory); 

        try { 
          List items = upload.parseRequest(request); 
          Iterator it = items.iterator(); 
          while (it.hasNext()) { 
            FileItem item = (FileItem) it.next(); 
            if (!item.isFormField() 
                && "uploadFormElement".equals(item.getFieldName())) { 
              return item; 
            } 
          } 
        } catch (FileUploadException e) { 
          return null; 
        } 
        return null; 
      } 
     }

サーブレットのマッピングを web.xml ファイルに追加しました

<servlet>
    <servlet-name>FileUpload</servlet-name>
    <servlet-class>my.web.app.GwtFileUpload.server.FileUploadServlet</servlet-class>
</servlet>
 ....
<servlet-mapping>
    <servlet-name>FileUpload</servlet-name>
    <url-pattern>/FileUpload</url-pattern>
</servlet-mapping>

ファイルを選択してサブミットを呼び出すと、Firefox を使用しているときに実際には何も起こりませんでした (取得したのは SubmitEvent だけです)。サーブレット コードでマークしたブレークポイントに到達しませんでした。

クロムで同じコードを試してみると、サーブレットに入っていますが、ファイルが見つかりませんでした

なぜこんなに異なる動作があるのか​​ 、どうすれば修正できるのか、誰かが説明してくれますか?

4

3 に答える 3

3

FileUploadウィジェットは要素をラップしますHTML 。このウィジェットはFormPanel、サーバーに送信する場合に使用する必要があります。したがって、fileupload を に追加する必要がありFormPanelます。に直接追加しましたPanel。コードを差し替えてください

this.add(fileUpload);

form.add(fileUpload);

詳細については、リンクhttp://www.tutorialspoint.com/gwt/gwt_fileupload_widget.htmを参照してください。

于 2013-06-12T17:38:42.313 に答える
0

gwtupload ライブラリを使用することをお勧めします。これにより、独自のコードを記述する時間が大幅に節約され、カスタマイズ ボタン、プログレス バー、ファイル拡張子、サイズ制限などの多くの機能がアプリに提供されます。

このGettingStartedとこのサンプルページがあります。

于 2013-06-13T05:56:23.107 に答える