2013-01-11 96 views
2

我想使用GWT將文件上傳到REST Web服務。但是,我在以下字段中獲得了空值。GWT文件上傳到REST Web服務

InputStream uploadedInputStream, FormDataContentDisposition fileDetail 

以下是我的GWT客戶端代碼

public void onModuleLoad() { 
     Button button = new Button("Click Here"); 
     final FormPanel form = new FormPanel(); 
     final FileUpload fileUpload = new FileUpload(); 
     form.setMethod(FormPanel.METHOD_POST); 
     form.setEncoding(FormPanel.ENCODING_MULTIPART); 
     fileUpload.setName("upload"); 
     form.add(fileUpload); 
     form.setAction("http://localhost:8080/RestWeb/webresources/generic/upload"); 
     RootPanel.get().add(form); 
     RootPanel.get().add(button); 
     button.addClickHandler(new ClickHandler() { 

      @Override 
      public void onClick(ClickEvent event) { 
       System.out.println(fileUpload.getFilename()); 
       System.out.println(fileUpload.getName()); 
       System.out.println(fileUpload.getStyleName()); 
       fileUpload.setEnabled(true); 

       System.out.println(form.getTarget()); 
       form.submit(); 
      } 
     }); 
     form.addSubmitHandler(new SubmitHandler() { 

      @Override 
      public void onSubmit(SubmitEvent event) { 
     Window.alert("Onsubmit"); 

      } 
     }); 
     form.addSubmitCompleteHandler(new SubmitCompleteHandler() { 

      @Override 
      public void onSubmitComplete(SubmitCompleteEvent event) { 
       Window.alert("OnsubmitComplete"+event.getResults()); 

      } 
     }); 
    } 
} 

以下是我的服務器端代碼。我有客戶端和服務器之間的連接,但只有空值。我不明白我的錯誤。我提到很多網站,但我得到了相同的代碼。

@Path("generic") 
@WebService 
public class GenericResource { 

    @Context 
    private UriInfo context; 
    @Context 
    private HttpServletResponse response; 
    private String content = "content"; 

    /** 
    * Creates a new instance of GenericResource 
    */ 
    public GenericResource() { 
    } 
@POST 
    @Path("/upload") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 

    public Response uploadFile(
      @FormDataParam("file") InputStream uploadedInputStream, 
      @FormDataParam("file") FormDataContentDisposition fileDetail) { 

     String uploadedFileLocation = "C://Users/SPC/Parvathy/upload" + fileDetail.getFileName(); 

     // save it 
     writeToFile(uploadedInputStream, uploadedFileLocation); 

     String output = "File uploaded to : " + uploadedFileLocation; 

     return Response.status(200).entity(output).build(); 

    } 

    // save uploaded file to new location 
    private void writeToFile(InputStream uploadedInputStream, 
      String uploadedFileLocation) { 

     try { 
      OutputStream out = new FileOutputStream(new File(
        uploadedFileLocation)); 
      int read = 0; 
      byte[] bytes = new byte[1024]; 

      out = new FileOutputStream(new File(uploadedFileLocation)); 
      while ((read = uploadedInputStream.read(bytes)) != -1) { 
       out.write(bytes, 0, read); 
      } 
      out.flush(); 
      out.close(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
     } 
    } 

    public class CorsFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 
     // if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) { 
      // CORS "pre-flight" request 
       response.addHeader("Content-Type", 
       "multipart/form-data"); 
      response.addHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8888"); 
      response.addHeader("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS"); 
      response.addHeader("Access-Control-Allow-Headers","origin, access-control-allow-methods, content-type, access-control-allow-origin, access-control-allow-headers"); 
      response.addHeader("Access-Control-Max-Age", "1800");//30 min 
     // } 
     filterChain.doFilter(request, response); 
     } 
    } 

請幫幫我。 在此先感謝。

+0

我要上傳到REST Web服務代碼。在GWT中不使用RPC。 REST Web服務是一個單獨的項目,GWT只是客戶端 – Parvathy

回答

1

通訊剛剛嘗試這一點。 在您的GWT代碼中,您使用的是FileUpload類,名稱爲upload。 所以GWT將生成名稱爲upload的輸入字段(請檢查您的html源文件以確認)。所以當你從瀏覽器發送字段作爲參數具有相同的名稱。 在你的web服務,你必須趕上同名帕拉姆.. 改變這樣

public Response uploadFile(
      @FormDataParam("upload") InputStream uploadedInputStream, 
      @FormDataParam("upload") FormDataContentDisposition fileDetail) { 


} 
+0

謝謝。它的工作正常。 – Parvathy