Я пытаюсь опубликовать файл с углового контроллера на бэкэнд. Но контроллер 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 в файле конфигурации. Любая идея по этому поводу? Я отчаянно ищу решение.
Вот фрагмент кода, который работает для меня:
Контроллер 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
но вы не возвращаете ее. Поэтому я предполагаю, что вы делаете что-то еще, и вы удалили код, чтобы опубликовать вопрос и пропустили его, иначе он даже не будет построен.
Наконец, вы можете проверить этот ответ, который я дал аналогичной проблеме.