首页 > 解决方案 > Multipart/formdata 文件类型字段总是获取一些数据,即使它是一个可选字段

问题描述

我无法理解,为什么可选文件字段总是取一些多部分值,即使我没有选择任何文件。

场景是,我正在制作一个用户可以发送电子邮件的屏幕,它具有可选的附件字段。

@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) {

文件总是有价值的。

文件:可选[org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@4668b691]

调试时显示,它不包含任何名称。

这是日志跟踪,可能会有用。提前致谢。

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)

标签: springspring-bootthymeleaf

解决方案


用于MultipartFile.isEmpty()查看是否选择了实际文件:

来自 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();

推荐阅读