GWT FileUpload - Servlet 选项和处理响应

标签 gwt servlets file-upload form-submit

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

  • 实际上传或写入服务器(或磁盘)上的文件内容将由 servlet 完成。
    这个 servlet(比如 MyFileUploadServlet)是否有必要扩展 HttpServlet?或者
    我可以使用 RemoteServiceServlet 或实现任何其他接口(interface)吗?如果是,我需要实现/覆盖哪种方法?
  • 在我的 servlet 中,一切都完成后,我需要将响应返回给客户端。
    我认为 form.addSubmitCompleteHandler() 可以用来实现这一点。从 servlet,我可以返回 text/html(或 String 类型对象),然后使用 SubmitCompleteEvent.getResults() 来获取结果。
    问题是我可以使用我的自定义对象而不是字符串(比如说 MyFileUploadResult),在其中填充结果然后将其传递回客户端吗?
    或者我可以取回 JSON 对象吗?
  • 目前,在获取响应并使用 SubmitCompleteEvent.getResults() 后,我将一些 HTML 标记添加到实际响应中,例如:

  • pre> 图片上传成功/pre> .

    有没有办法摆脱它?

    提前非常感谢!

    问候,

    阿什什

    最佳答案

    为了上传文件,我过去扩展了 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服务于 /textupload 的 HttpServlet .
    public class UploadFileAsText extends UploadFile {
    
      public UploadFileAsText() {
        uploadForm.setAction(GWT.getModuleBaseURL() + "textupload");
      }
    }
    

    纯文本文件的 servlet 位于服务器端。它将上传文件的内容返回给客户端。确保从 Apache Commons 在类路径的某处安装用于 FileUpload 的 jar。
    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);
        }
      } 
    }
    

    我不记得我是如何绕过 <pre></pre> 的。标签问题。您可能必须过滤客户端上的标签。该主题也解决了here .

    关于GWT FileUpload - Servlet 选项和处理响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9712374/

    相关文章:

    ruby-on-rails - Rails ajax 文件上传和 nginx

    java gwt 图像不可见

    java - 如何在 servlet 应用程序中实现服务层

    java - 维护客户端http客户端-服务器连接的正确方法?

    java - 使用 enctype=multipart/form-data : java servlets 时无法获取表单字段的值

    php - php 中的 tmp 文件名是如何生成的?

    python - 如何检查上传的 N x M csv 文件是否具有某些标题?

    java - 无法使 GWT-RPC 正常工作

    java - 能否将 GWT 配置为在用户主文件夹以外的其他位置创建缓存文件?

    java - GWT:如何滚动到页面底部?