Я пытаюсь загрузить файл из внешнего интерфейса AngularJS в бэкэнд Spring MVC, используя сервер Tomcat 8.
Это моя функция контроллера AngularJS:
vm.add = function(photo) {
let file = document.getElementById('file').files[0];
let reader = new FileReader();
reader.onload = function(e) {
let photoFile = e.target.result;
photoService.create($routeParams.lid, photo,photoFile).then(
function(response) {
$location.path('/books');
vm.photo = response.data;
})
}
reader.readAsBinaryString(file);
}
Это моя сервисная функция, все еще на стороне AngularJS:
service.create = function(bookId, photo, file) {
var formData = new FormData();
formData.append('name', photo.name);
formData.append('file', file);
return $http(
{
url : BASE_URL + authService.getToken().id
+ '/book/' + bookId + '/photo/',
method : 'POST',
data : formData,
headers : {
'Content-Type' : undefined
},
transformRequest: angular.identity
}).then(function(res) {
return res;
});
};
У меня есть этот компонент в моем диспетчере xml:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="10000000" />
</bean>
И это в моем Spring MVC контроллере:
@Override
@RequestMapping(value = "user/{uid}/book/{lid}/photo", method = RequestMethod.POST)
public Photo create(HttpServletRequest request, HttpServletResponse response,
@PathVariable int uid, @PathVariable int lid,
@RequestParam("file") MultipartFile file) {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
return photoDAO.create(uid,lid,file);
}
Я могу просто отправить файл и сохранить его прямо из html, но по какой-то причине отправка его из AngualrJS дает мне эту ошибку на стороне Spring:
2018-09-02 17:45:00,027 DEBUG [org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod] - Error resolving argument [4] [type=org.springframework.web.multipart.MultipartFile]
HandlerMethod details:
Controller [controllers.PhotoControllerImpl]
Method [public entities.Photo controllers.PhotoControllerImpl.create(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,int,int,org.springframework.web.multipart.MultipartFile)]
org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present
Несмотря на то, что я вижу файл в полезной нагрузке моего запроса:
018-09-02 17:45:00,028 DEBUG [com.github.isrsal.logging.LoggingFilter] - Request: request id=4; method=POST; content type=multipart/form-data; boundary=----WebKitFormBoundaryfNOybpMz7ZO1IyZX; uri=/InfiniteLegacyREST/api/user/1/legacy/1/photo/; payload=------WebKitFormBoundaryfNOybpMz7ZO1IyZX
Content-Disposition: form-data; name="name"
s
------WebKitFormBoundaryfNOybpMz7ZO1IyZX
Content-Disposition: form-data; name="file"
this is a text
------WebKitFormBoundaryfNOybpMz7ZO1IyZX--
Что вызывает это? Почему загрузка файла в multipart / form-data, напрямую отправленном из html, работает нормально, а выполнение из AngularJS - нет?