2014-01-10 55 views
0

構建我的客戶機應用程序(AngularJS),我將一個文件和一些其他數據上載爲FormData。Spring MVC - 在Multipart HTTP中獲取非mulitpart表單/數據Post

var formData=new FormData(); 
      formData.append("file",file.files[0]); //files 
      formData.append("docData", angular.toJson($scope.docdata)); //invoice 

angular.toJson($scope.docdata)價值就像{"configuration":20,"title":"invoicedata"}

這是我的HTTP發佈

$http({ 
        method: 'POST', 
        url: uploadurl, 
        headers: {'Content-Type': false}, 
        data: formData, 
        transformRequest: function(data, headersGetterFunction) { 
         return data; 
        } 
       }) 
       .success(function(data, status) { 
        alert("Error"); 

       }) 
       .error(function(data, status) { 
        alert("Error"); 

       }); 

請求是在我的Spring MVC控制器獲取和我能夠用文件來處理。但其他數據(docData),我無法得到。

這裏是我的UploadController.java

@Controller 
public class UploadController { 

    @RequestMapping(value="/newDocument", method = RequestMethod.POST) 
    public void UploadFile(HttpServletRequest request, HttpServletResponse response) { 

     MultipartHttpServletRequest mRequest=(MultipartHttpServletRequest)request; 

     Iterator<String> itr=mRequest.getFileNames(); 
     while(itr.hasNext()){ 
      MultipartFile file=mRequest.getFile(itr.next()); 
      String fileName=file.getOriginalFilename(); 

      try { 

      File newFile = new File("/home/myHome/file-uploaded/"+fileName); 

       // if the directory does not exist, create it 
       if (!newFile.getParentFile().exists()) { 
       newFile.getParentFile().mkdirs(); 
       } 
       FileCopyUtils.copy(file.getBytes(), newFile); 
      } 
      catch(FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      catch(IOException e) { 
       e.printStackTrace(); 
      } 

     } 

     Enumeration<String> parametrs = request.getParameterNames(); 

     while(parametrs.hasMoreElements()) { 
      String param=parametrs.nextElement(); 
      System.out.println("Param : " + param); 
      Object object=request.getAttribute(param); 
      System.out.println("Param Instance" + object.getClass().getName()); 
     } 
    } 
} 

第一部分是可以正常使用。 (將文件複製到目錄)。但第二部分給我一個例外。首先它打印出我在FormData中發送Form客戶端應用程序的參數docData的值。然後它會拋出異常63

java.lang.NullPointerException 
    at com.serverapp.demoapp.web.UploadController.UploadFile(UploadController.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

線是指System.out.println("Param Instance" + object.getClass().getName()); 這意味着該對象爲null

如何獲取值?

回答

1

當您使用multipart時,您的表單域將包含在request Stream中。所以你必須檢查它們是否是表單域。

這是我在一個servlet中使用的,你可以在其中做適當的修改,以在Spring-MVC中工作。

boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
     if (isMultipart) 
     { 
      FileItemFactory factory = new DiskFileItemFactory(); 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      try 
      { 
       List items = upload.parseRequest(request); 
       Iterator iterator = items.iterator(); 
       while (iterator.hasNext()) 
       { 
        FileItem item = (FileItem) iterator.next(); 

        if (item.isFormField()) //your code for getting form fields 
        { 
         String name = item.getFieldName(); 
         String value = item.getString(); 
         System.out.println(name+value); 
        } 

        if (!item.isFormField()) 
        { 
         //your code for getting multipart 
        } 
       } 
      } 
+0

如何檢查? –

+0

@ShijuKBabu我已經更新了servlet中使用的代碼。 'if(item.isFormField())'條件包含獲取非多部分數據的代碼。 – Bhushan

+0

這裏的「上傳」是什麼? –