2014-01-10 49 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

这里的“上传”是什么? –