GWT FileUpload - Servlet选项和处理响应

时间:2012-03-15 00:27:02

标签: gwt servlets file-upload form-submit

我是GWT的新手,正在尝试实现文件上传功能。 在互联网上找到了一些实施帮助,并将其作为参考。 但是有一些与此相关的问题:

  1. 实际上传或写入服务器(或磁盘)上的文件内容将由servlet完成。 这个servlet(比如MyFileUploadServlet)是否有必要扩展HttpServlet?要么 我可以使用RemoteServiceServlet或实现任何其他接口?如果是,我需要实现/覆盖哪种方法?

  2. 在我的servlet中,完成所有操作后,我需要将响应返回给客户端。 我认为form.addSubmitCompleteHandler()可以用来实现它。从servlet,我可以返回text / html(或String类型对象),然后使用SubmitCompleteEvent.getResults()来获取结果。 问题是我可以使用我的自定义对象而不是String(比如MyFileUploadResult),在其中填充结果然后将其传递回客户端吗? 或者我可以找回JSON对象吗?

  3. 目前,在收到回复并使用SubmitCompleteEvent.getResults()之后,我会在实际响应中添加一些HTML标记,例如:

  4. 预>图片上传成功/预先>

    有没有办法摆脱它?

    提前多多感谢!

    此致

    与Ashish

1 个答案:

答案 0 :(得分:2)

要上传文件,我过去已经扩展了HttpServlet。我和Commons-FileUpload一起使用它。

我为基于表单的上传制作了一个通用小部件。那是为了适应不同文件类型的上传(纯文本和Base64)。如果您只需要上传纯文本文件,则可以将以下两个类合并为一个。

public class UploadFile extends Composite {

  @UiField FormPanel uploadForm;
  @UiField FileUpload fileUpload;
  @UiField Button uploadButton;

  interface Binder extends UiBinder<Widget, UploadFile> {}

  public UploadFile() {
    initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));

    fileUpload.setName("fileUpload");

    uploadForm.setEncoding(FormPanel.ENCODING_MULTIPART);
    uploadForm.setMethod(FormPanel.METHOD_POST);

    uploadForm.addSubmitHandler(new SubmitHandler() {
      @Override
      public void onSubmit(SubmitEvent event) {
        if ("".equals(fileUpload.getFilename())) {
          Window.alert("No file selected");
          event.cancel();
        }
      }
    });

    uploadButton.addClickHandler(new ClickHandler() {
      @Override
      public void onClick(ClickEvent event) {
        uploadForm.submit();
      }
    });
  }

  public HandlerRegistration addCompletedCallback(
      final AsyncCallback<String> callback) {
    return uploadForm.addSubmitCompleteHandler(new SubmitCompleteHandler() {
        @Override
        public void onSubmitComplete(SubmitCompleteEvent event) {
          callback.onSuccess(event.getResults());
        }
    });
  }
}

UiBinder部分非常简单。

<g:HTMLPanel>
  <g:HorizontalPanel>
    <g:FormPanel ui:field="uploadForm">
      <g:FileUpload ui:field="fileUpload"></g:FileUpload>
    </g:FormPanel>
    <g:Button ui:field="uploadButton">Upload File</g:Button>
  </g:HorizontalPanel>
</g:HTMLPanel>

现在,您可以为纯文本文件扩展此类。只需确保web.xml /textuploadpublic class UploadFileAsText extends UploadFile { public UploadFileAsText() { uploadForm.setAction(GWT.getModuleBaseURL() + "textupload"); } } 处为HttpServlet提供服务。

public class TextFileUploadServiceImpl extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doPost(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {

    if (! ServletFileUpload.isMultipartContent(request)) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST,
          "Not a multipart request"); 
      return;
    }

    ServletFileUpload upload = new ServletFileUpload(); // from Commons

    try {
      FileItemIterator iter = upload.getItemIterator(request);

      if (iter.hasNext()) {
        FileItemStream fileItem = iter.next();

//      String name = fileItem.getFieldName(); // file name, if you need it

        ServletOutputStream out = response.getOutputStream();
        response.setBufferSize(32768);
        int bufSize = response.getBufferSize(); 
        byte[] buffer = new byte[bufSize];

        InputStream in = fileItem.openStream();
        BufferedInputStream bis = new BufferedInputStream(in, bufSize);

        long length = 0;

        int bytes; 
        while ((bytes = bis.read(buffer, 0, bufSize)) >= 0) {
          out.write(buffer, 0, bytes);
          length += bytes;
        }

        response.setContentType("text/html");
        response.setContentLength(
            (length > 0 && length <= Integer.MAX_VALUE) ? (int) length : 0);

        bis.close();
        in.close();
        out.flush();
        out.close();
      }
    } catch(Exception caught) {
      throw new RuntimeException(caught);
    }
  } 
}

纯文本文件的servlet位于服务器端。它将上载文件的内容返回给客户端。确保在类路径的某个地方从Apache Commons安装FileUpload的jar。

<pre></pre>

我无法回想起我是如何解决{{1}}代码问题的。您可能必须过滤客户端上的标记。该主题还涉及here