GWT FileUpload-Servlet选项和处理响应

GWT FileUpload-Servlet选项和处理响应,gwt,servlets,file-upload,form-submit,Gwt,Servlets,File Upload,Form Submit,我是GWT新手,正在尝试实现文件上传功能。 在internet上找到一些实现帮助,并将其用作参考。 但我有一些与此相关的问题: 服务器(或磁盘)上文件内容的实际上传或写入将由servlet完成。 这个servlet(比如MyFileUploadServlet)是否需要扩展HttpServlet?或 我可以使用RemoteServiceServlet或实现任何其他接口?如果是,我需要实现/覆盖哪种方法 在我的servlet中,完成所有操作后,我需要将响应返回给客户机。 我认为form.addSub

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

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

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

  • 当前,在返回响应并使用SubmitCompleteEvent.getResults()后,我将在实际响应中添加一些HTML标记,例如:

  • pre>图像上载成功/pre>

    有没有办法摆脱它

    提前多谢

    问候,


    Ashish

    为了上传文件,我在过去扩展了HttpServlet。我和你一起用

    我为基于表单的上传制作了一个通用小部件。这是为了适应不同文件类型(纯文本和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());
            }
        });
      }
    }
    
    纯文本文件的servlet位于服务器端。它将上载文件的内容返回给客户端。确保在类路径的某个地方安装jar以便从Apache Commons上传文件

    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);
        }
      } 
    }
    
    公共类TextFileUploadServiceImpl扩展了HttpServlet{
    私有静态最终长serialVersionUID=1L;
    @凌驾
    受保护的void doPost(HttpServletRequest请求,
    HttpServletResponse响应)引发ServletException,IOException{
    如果(!ServletFileUpload.isMultipartContent(请求)){
    response.sendError(HttpServletResponse.SC\u错误\u请求,
    “不是多部分请求”);
    返回;
    }
    ServletFileUpload upload=新建ServletFileUpload();//来自Commons
    试一试{
    FileItemIterator iter=upload.getItemIterator(请求);
    if(iter.hasNext()){
    FileItemStream fileItem=iter.next();
    //String name=fileItem.getFieldName();//文件名,如果需要
    ServletOutputStream out=response.getOutputStream();
    答复:setBufferSize(32768);
    int bufSize=response.getBufferSize();
    字节[]缓冲区=新字节[bufSize];
    InputStream in=fileItem.openStream();
    BufferedInputStream bis=新的BufferedInputStream(in,bufSize);
    长长度=0;
    整数字节;
    而((字节=bis.read(buffer,0,bufSize))>=0){
    out.write(缓冲区,0,字节);
    长度+=字节;
    }
    response.setContentType(“text/html”);
    response.setContentLength(
    (长度>0&&L)
    
    public class UploadFileAsText extends UploadFile {
    
      public UploadFileAsText() {
        uploadForm.setAction(GWT.getModuleBaseURL() + "textupload");
      }
    }
    
    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);
        }
      } 
    }