Как заставить службу Spring REST принимать данные из нескольких файлов, отправленные угловым контроллером?

0

Я пытаюсь опубликовать файл с углового контроллера на бэкэнд. Но контроллер Spring REST получает нуль.

JS

myApp.controller('myCtrl', ['$scope', '$http', function($scope, $http){
             $scope.uploadFile = function(){
                    var formData=new FormData();
                    formData.append("file", $scope.myFile); 
                    alert("Hi");
                    $http({
                        method: 'POST',
                        url: 'upload', 
                        headers: {'Content-Type': undefined}, 
                        data: formData,
                        transformRequest: function(data, headersGetterFunction) {
                            return data;
                        }
                    }).success(function(data, status) {  
                         console.log('file is ' );
                         console.dir(data);
                    })
                    .error(function(data, status) {
                    });
                }
         }]);

Контроллер Spring-REST

 @RequestMapping(value="/upload", method=RequestMethod.POST)
         public @ResponseBody String upload(@RequestBody MultipartFile file)  {
                        System.out.println(file);
}

Я также попытался использовать public @ResponseBody void uploadFile (запрос MultipartHttpServletRequest, ответ HttpServletResponse), но он бесполезен. Я также объявил multipartResolver в файле конфигурации. Любая идея по этому поводу? Я отчаянно ищу решение.

  • 0
    Итак ... почему ваш Content-Type "не определен" вместо, скажем, "multipart / mixed"?
  • 0
    @Makoto, установив Content-Type: undefined, браузер устанавливает для нас Content-Type multipart / form-data и заполняет правильную границу. Установка «Content-Type» вручную: multipart / form-data не сможет заполнить граничный параметр запроса.
Показать ещё 4 комментария
Теги:
spring
rest

1 ответ

0

Вот фрагмент кода, который работает для меня:

Контроллер Spring-REST

@RequestMapping(value = "/api/users/{id}/image", method = RequestMethod.POST)
@ResponseBody
public boolean uploadUserImage( @PathVariable("id") Long id, @RequestParam("file") MultipartFile file ) {
    return userService.saveUserImage(id, file);
}

и в интерфейсе вы можете сделать что-то подобное

Угловой контроллер

//the image
$scope.uploadme;

$scope.uploadImage = function() {
  var fd = new FormData();
  var imgBlob = dataURItoBlob($scope.uploadme);
  fd.append('file', imgBlob);
  $http.post(
      '/upload',
      fd, {
        transformRequest: angular.identity,
        headers: {
          'Content-Type': undefined
        }
      }
    )
    .success(function(response) {
      console.log('success', response);
    })
    .error(function(response) {
      console.log('error', response);
    });
}


//you need this function to convert the dataURI
function dataURItoBlob(dataURI) {
  var binary = atob(dataURI.split(',')[1]);
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
  var array = [];
  for (var i = 0; i < binary.length; i++) {
    array.push(binary.charCodeAt(i));
  }
  return new Blob([new Uint8Array(array)], {
    type: mimeString
  });
}

Предполагая, что HTTP-запрос правильный, проблема должна быть у контроллера Spring. Я думаю, вы должны изменить upload(@RequestBody MultipartFile file) для upload(@RequestParam("file") MultipartFile file). Так будет:

@RequestMapping(value="/upload", method=RequestMethod.POST)
@ResponseBody
public void upload(@RequestParam("file") MultipartFile file)  {
    System.out.println(file);
}

Также в вашей функции вы возвращаете String но вы не возвращаете ее. Поэтому я предполагаю, что вы делаете что-то еще, и вы удалили код, чтобы опубликовать вопрос и пропустили его, иначе он даже не будет построен.

Наконец, вы можете проверить этот ответ, который я дал аналогичной проблеме.

  • 0
    Спасибо за Ваш ответ. Я использовал директиву и сервис и его работу. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню