Search code examples
springspring-bootthymeleaf

Multipart/formdata filetype field is always taking some data, even though it is a optional field


I am not able to understand, why optional file field is always taking some multipart value, even I did not choose any files.

Scenario is, I am making a screen where user can send the email, it has attachment field to which is optinal.

@PostMapping(value = "email", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String sendEmail(@RequestParam String retailers,
                        @RequestParam(name="selected-retailer", required = false) List<String> selectedRetailer,
                        @RequestParam(name="individual-email", required = false) String individualEmail,
                        @RequestParam String subject,
                        @RequestParam String message,
                        @RequestParam(required = false, name = "documents") MultipartFile documents) {

documents is always taking a value.

documents : Optional[org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@4668b691]

While debugging it reveals that, it does not contain any name.

Here is log trace, one might find useful. Thanks in advance.

java.nio.file.AccessDeniedException: E:\Spring Projects\proofreader\CementSchemes\uploads
    at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:89)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:231)
    at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)
    at java.base/java.nio.file.Files.newOutputStream(Files.java:219)
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.transferTo(StandardMultipartHttpServletRequest.java:270)
    at com.hubrootsolutions.cementschemes.messaging.MessagingController.sendEmail(MessagingController.java:98)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)

Solution

  • Use MultipartFile.isEmpty() to see if an actual file was selected:

    From the Javadoc:

        /**
         * Return whether the uploaded file is empty, that is, either no file has
         * been chosen in the multipart form or the chosen file has no content.
         */
        boolean isEmpty();