Загрузка файла из AngularJS в Spring MVC на Tomcat 8 выдает эту ошибку: Обязательная часть запроса 'file' отсутствует - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь загрузить файл из внешнего интерфейса 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 - нет?

1 Ответ

0 голосов
/ 03 сентября 2018

Глядя на ваше сообщение об ошибке, @RequestParam MultipartFile, который вы используете в своем общедоступном методе создания фотографий (...) , может потребоваться вместо @RequestPart:

@RequestPart(name = "file", required = false) MultipartFile file

В моем приложении TightBlog есть рабочий пример загрузки файлов на основе Spring и Angular: REST controller , angular.js и JSP .

...