2014-01-10 1 views
0

Создайте мое клиентское приложение (AngularJS), я загружаю файл и некоторые другие данные в формате FormData.Spring MVC - Получите форму или данные, отличные от mulitpart, в Multipart HTTP 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()); 
     } 
    } 
} 

Первая часть работает отлично. (Копирование файла в каталог). Но вторая часть дает мне исключение. Сначала он печатает значение параметра, которое является docData тем, которое я отправляю в клиентское приложение формы FormData. Затем он бросает исключение

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

Когда вы используете multipart, тогда ваши поля формы включены в request Stream. Поэтому вы должны проверить, являются ли они полями формы или нет.

Это то, что я использую в сервлете, вы можете внести в него соответствующие изменения, чтобы работать в 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 У меня есть обновленный код, который я использовал в сервлетах. 'if (item.isFormField())' условие содержит код для получения не multipart данных. – Bhushan

+0

Что такое 'upload' здесь? –

Смежные вопросы