2016-10-04 2 views
1

Мы используем AngularJS 1.5.8, Spring 3.2.17, Jackson 2.6.7;Загрузка файла в приложение AngularJS JSON Spring MVC 400 Bad Request Требуемый номер запроса нет

Нам необходимо реализовать загрузку файлов с помощью объекта JSON DTO. Мы не можем видеть успех с загрузкой файлов с несколькими конфигурациями и подходами, только DTO, поскольку параметр запроса json работает нормально.

Заранее благодарен!

фрагменты bill_payment.html

<form name="billPaymentForm" enctype="multipart/form-data" ng-submit="onSaveIRFBillPayment()"> 
<!-- some more elements as part of billPaymentDTO --> 
<td class="fielddata6"> 
<input type = "file" file-model = "attachments.depositSlipFile"/> 
</td> 

app.js

var app = angular.module('app', [ 'ngRoute', 'ngResource', 'billPaymentAppControllers', 'billPaymentAppServices' ]); 
... 

app.directive('fileModel', ['$parse', function ($parse) { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      var model = $parse(attrs.fileModel); 
      var modelSetter = model.assign; 

      element.bind('change', function(){ 
      scope.$apply(function(){ 
       modelSetter(scope, element[0].files[0]); 
      }); 
      }); 
     } 
    }; 
}]); 

billPaymentControllers.js

var billPaymentAppControllers = angular.module('billPaymentAppControllers', [ 'billPaymentAppServices' ]); 

billPaymentAppControllers.controller('billPaymentCtrl',['$routeParams', '$route', '$scope', '$location', '$http', '$window', 'BillPaymentService', function($routeParams, $route, $scope, $location, $http, $window, BillPaymentService) { 
// many other functions 

$scope.onSaveIRFBillPayment =function(){ 
BillPaymentService.saveBillPayment.saveBillPaymentDtls(
{ 
    billPaymentDTO : $scope.billPaymentDTO, 
    depositSlipFile : $scope.attachments.depositSlipFile 
},function(result) { 
     console.log(result); 
     if(result!=null && result.returnVal!=null && result.returnVal!="" && result.returnVal == "SUCCESS"){ 
     alert("Bill Payment Saved Successfully"); 
     } else { 
     alert("Error while Saving Bill Payment, please contact IT team"); 
     return false; 
    } 
}); 

} 

billPaymentServices.js

billPaymentAppServices.factory('BillPaymentService', function($resource, $http) { 
    return{ 

     saveBillPayment : $resource('agreement/saveIRFBillPayment/', {}, { 
      'saveBillPaymentDtls' : { 
       method : 'POST', 
       headers: {'Content-Type': undefined}, 
       //transformRequest: angular.identity,     
       transformRequest: function (data) { 
         var formData = new FormData(); 
         console.log("data DTO: "+angular.toJson(data.billPaymentDTO)); 
         formData.append('billPaymentDTO', angular.toJson(data.billPaymentDTO));     
        //console.log("data file Content: "+data.depositSlipFile); 
        //formData.append('billPaymentDTO', new Blob([angular.toJson(data.billPaymentDTO)], { 
        //type: "application/json" 
        //})); 
         formData.append("file", data.depositSlipFile); 
         return formData; 
       }, 
        transformResponse : function(data) { 
        console.log(data); 
        data = {"returnVal":data}; 
        return data; 
       } 
      } 
     }) 
    } 
} 

BillPaymentRestController.java

//@ExceptionHandler(Exception.class) 
/*** This signature is working for DTO object alone in request ***/ 
//@RequestMapping(value="/saveIRFBillPayment", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
//public @ResponseBody String saveIRFBillPayment(@RequestBody String billPaymentDTO,HttpServletRequest request) throws RatingsServiceException, Exception{ 

/*** tried without consumes attribute, without argument HttpServletRequest request ***/ 
//@RequestMapping(value="/saveIRFBillPayment", method = RequestMethod.POST) 
//@ResponseBody String saveIRFBillPayment(@RequestPart("billPaymentDTO") String billPaymentDTO, @RequestPart("file") MultipartFile depositSlipFile) throws RatingsServiceException, Exception{ 

//public @ResponseBody String saveIRFBillPayment(@RequestParam String billPaymentDTO, @RequestParam("file") MultipartFile depositSlipFile, HttpServletRequest request) throws RatingsServiceException, Exception{ 

@RequestMapping(value="/saveIRFBillPayment", method = RequestMethod.POST, consumes = {"multipart/form-data"}) 
@ResponseBody String saveIRFBillPayment(@RequestPart("billPaymentDTO") String billPaymentDTO, HttpServletRequest request, @RequestPart("file") MultipartFile depositSlipFile) throws Exception{ 

    System.out.println("Data inside saveIRFBillPayment:"+billPaymentDTO); 
    System.out.println("\nFile inside saveIRFBillPayment:"+depositSlipFile); 
    ObjectMapper mapper = new ObjectMapper(); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    mapper.setDateFormat(dateFormat); 
    String status="Fail"; 
    try{ 
    BillPaymentDTO billPaymentDTOConverted = mapper.readValue(billPaymentDTO, BillPaymentDTO.class); 
    File ExtractedDepositSlipFile = billPaymentDTOConverted.getDepositSlipFile(); 
    System.out.println("File exists Check: "+ExtractedDepositSlipFile.exists()); 

    //Call to some service 
    status="SUCCESS"; 

    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return status; 
} 

dipatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <context:component-scan base-package="com.xxx.xxxxx.restController.addAgreement" /> 
    <tx:annotation-driven /> 
    <mvc:annotation-driven /> 

    <!--  Added by PV - Type conversion --> 
    <bean id="jacksonMessageConverter" 
     class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 


    <bean 
     class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
    <list> 
      <ref bean="jacksonMessageConverter" /> 
    </list> 
    </property> 
    </bean> 

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
    <property name="maxUploadSize" value="268435456" /> <!-- 256 megs --> 
    </bean> 

    <bean id="methodHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver"> 
     <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
     </list> 
     </property> 
    </bean> 
</beans> 

заголовок запроса:

Request:    POST /RatingsBD/cc-app/agreement/saveIRFBillPayment HTTP/1.1 
X-Requested-With:   XMLHttpRequest 
Accept:     application/json, text/plain, */* 
Content-Type: multipart/form-data; boundary=---------------------------7e01c61b10544 

Запрос кузова:

Blank! when DTO being sent alone, it has json string with boundary 

Header Ответа:

Response:   HTTP/1.1 400 Bad Request 

Response Body:

Required request part 'billPaymentDTO' is not present. 
+0

'formData.append ('billPaymentDTO', угловой.toJson (данные.billPaymentDTO)); 'не добавляет часть запроса. Пожалуйста, обратитесь к документации для 'FormData.append()'. – zeroflagL

+0

Измените свою формуData.append ('billPaymentDTO', angular.toJson (data.billPaymentDTO)); к JSON.stringify (data.billPaymentDTO) –

+0

мы попытались положить formData.append ('billPaymentDTO', JSON.stringify (data.billPaymentDTO)); вместо formData.append ('billPaymentDTO', angular.toJson (данные.billPaymentDTO)); все еще получая то же самое 400 Bad Request and Request Body идет как пусто –

ответ

0

Существует работу вокруг этой проблемы, попробуйте изменить $http вызов ниже способом, прилагая все свои значения billPaymentDTO в данной форме наряду с файл и т. д. на вашем контроллере включают параметры, как было запрошено.

    var formData= new FormData(); 

        formData.append('id', data.billPaymentDTO.ID); 
        formData.append('contactNumber', data.billPaymentDTO.number); 
        //add all the billPaymentDTO variables as mentioned above 
        formData.append("file", data.depositSlipFile); 
        var uploadUrl = $rootScope.BASE_URL + "agreement/saveIRFBillPayment"; 
        $http.post(uploadUrl, formData, { 
         transformRequest: angular.identity, 
         headers: { 
          'Content-Type': undefined, 
          'Accept': 'application/json' 
         } 
        }).success(function(data) { 
        //do something after success 
        }); 

в контроллере на JAVA стороне

@RequestMapping(value="/saveIRFBillPayment", method = RequestMethod.POST) 
     @ResponseBody String saveIRFBillPayment(HttpServletRequest request, HttpServletResponse response, 
           @RequestParam(value="file") MultipartFile document, 
           @RequestParam("id") Long id, 
           @RequestParam("contactNumber") String contactNumber, 
//similar way add all the attributes of billPaymentDTO here as parameter with required datatypes 
          ) { } 
+0

@ ng-10 :) К сожалению, это не сработало, имея такую ​​же проблему, если отправлять только DTO, запрос работает нормально, получить ошибку только при добавлении файла в запрос FormData или отправить только файл в запрос; был выше код работал для вас? –

+0

Да, это определенно работает! Вы реализовали способ, который я показал в фрагменте кода? Можете ли вы опубликовать свой измененный код? –

1

Вы пробовали что-то вроде этого.

$resource(
    url, 
    {}, 
    { 
    upload: { 
     method: 'POST', 
     headers: {enctype:'multipart/form-data'} 
    }, 
    } 
) 
+0

попробовали контент-тип, попробуем это и дадим вам знать –

+0

Еще одна проблема, это не сработало –

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

  • Нет связанных вопросов^_^