Spring MVC - 在Multipart HTTP Post中获取非多部分表单/数据

时间:2014-01-10 06:28:08

标签: java spring spring-mvc multipart

构建我的客户端应用程序(AngularJS),我正在上传文件和其他一些数据作为FormData。

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());
        }
    }
}

第一部分完美运作。 (将文件复制到目录)。但第二部分给了我一个例外。首先,它打印param的值,它是我在FormData中发送客户端应用程序的docData。然后它抛出异常

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)

第63行引用System.out.println("Param Instance" + object.getClass().getName()); 这意味着该对象为空

如何获取值?

1 个答案:

答案 0 :(得分: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 
                    }
                }
            }