Проблема при загрузке файла в Spring с помощью apache-commons-fileupload - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь загрузить изображение в веб-приложение, построенное на Spring MVC, используя локальный контейнер Tomcat, но код продолжает выдавать NullPointerException.

Я уже искал в сети учебники, но ни один из них не работал, в частности, я следовал тому, что предоставили сайты webSystique, Baeldung и mkyong. Все идет хорошо, в том числе проверка, до тех пор, пока не получит файл.
Поэтому, насколько я понимаю, конфигурация Spring и веб-приложение верны, за исключением части загрузки, показанной ниже.

Это код в AppConfig.java для настройки MultipartResolver для apache-commons:

@Bean
public CommonsMultipartResolver getResolver() throws IOException{

    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setMaxUploadSize(5242880); //max file size set to 5MB

    return resolver;
}

Это файл модели Image.java , который представляет файл:

public class Image {

private MultipartFile profilePicture;

public MultipartFile getProfilePicture() {
    return profilePicture;
}

public void setProfilePicture(MultipartFile profilePicture) {
    this.profilePicture = profilePicture;
}
}

Метод контроллера, который перенаправляет на форму:

@RequestMapping(value = "/upload-{id}", method = RequestMethod.GET)
public String uploadPage(ModelMap model){

    Image image = new Image();
    model.addAttribute("image", image); //set attribute to request map

    return "uploadForm";
}

Код формы на странице uploadForm.jps :

        <form:form method="POST" modelAttribute="image" enctype="multipart/form-data">
            <div class="row">
                <div class="form-group col-md-12">
                    <div class="col-md-7">
                        <form:input path="profilePicture" type="file" id="profilePicture"></form:input>
                        <form:errors path="profilePicture" cssClass="text-danger"></form:errors>
                    </div>
                </div>
            </div>
            <div class="row">
                <input type="submit" value="upload" class="btn btn-primary btn-sm">
            </div>
        </form:form>

и, наконец, сопоставленный метод для загрузки файла по новому пути:

@RequestMapping(value = "/upload-{id}", method = RequestMethod.POST)
public String fileUpload(@Valid Image profilePicture, BindingResult result, @PathVariable int id, ModelMap model) throws IOException {

    if(result.hasErrors()){ //in case of validation error redirect to form page
        return "uploadForm";
    }

    MultipartFile multipartFile = profilePicture.getProfilePicture();

    byte[] source = multipartFile.getBytes(); //source file bytes array
    File dest = new java.io.File(UPLOAD_LOCATION + profilePicture.getProfilePicture().getOriginalFilename()); //destination file
    //copying the file to the new position
    FileCopyUtils.copy(source, dest);

    String fileName = multipartFile.getOriginalFilename(); //original name of file got and saved in attributes map
    employeeService.updateImage(id, fileName);
    model.addAttribute("fileName", fileName);

    return "fileUploaded";
}

UPLOAD_LOCATION определяется внутри класса контроллера строкой:

private static final String UPLOAD_LOCATION = "C:/EmployeeManager/";

и О.С. это windows.

Исключение выдается в методе fileUpload в следующей строке:
byte[] source = multipartFile.getBytes(); //source file bytes array

Это основная причина, указанная в журнале:

java.lang.NullPointerException
employeeManager.controller.FileController.fileUpload(FileController.java:80)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

1 Ответ

0 голосов
/ 31 мая 2019

Ваша проблема вызвана NullPointerException, поэтому решение вашей проблемы довольно простое, убедитесь, что вы не пытаетесь получить доступ к элементам null объекта.

Исключение выдается в строке 80, и вы уже сами это определили:

java.lang.NullPointerException
employeeManager.controller.FileController.fileUpload(FileController.java:80)
byte[] source = multipartFile.getBytes(); //source file bytes array

Так что просто убедитесь, что ни multipartFile, ни profilePicture объекты не являются нулевыми, прежде чем они будут доступны. Согласно вашей трассировке стека, проблема заключается в одной из этих двух переменных.

...