解决 Processing of multipart/form-data request failed. /upload/A.tmp (No such file or directory) 问题

使用spring boot 上传,刚开始一切正常,但过了一段时间上传文件的时候出现错误。

ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]  - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. C:\Users\hp\AppData\Local\Temp\tomcat.7007283165982469173.7102\work\Tomcat\localhost\ROOT\upload_82a53f5c_e2da_43a5_9b71_d5349d403a82_00000067.tmp (系统找不到指定的路径。)] with root cause

究竟是什么原因呢?报错信息已经说了,就是找不到路径,这个路径是tomcat临时文件的目录。

那为什么一开始又一切正常呢?而过了一段时间后就报错了?

其实这跟临时文件夹存活时间有关。如果我们不指定tomcat运行根目录,那么在sping boot 项目启动时,系统会自动创建一个项目运行临时目录,一般在\AppData\Local\Temp\ 目录下。这个临时文件有自己的清理策略,会在一段时间后自动清理。所以说为什么刚开始运行一切正常,而过了一段时间之后就报找不到路径了。

网上有很多解决方案,但很多都无法真正解决,如:

第一种:修改maxInMemorySize,据说上传文件大小若小于此参数,则不会生成临时文件。所以要改小一点,然而并没有什么用。

<bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8" />
        <!-- 指定所上传文件的总大小不能超过2000KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
        <property name="maxUploadSize" value="2048000" />
        <!-- 设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240 -->
        <property name="maxInMemorySize" value="2048" />  
    </bean>
第二种:修改location的值
这个 location 可以理解为临时文件目录,可以通过配置 location 的值,但在spring boot下没有什么作用

/**
 * 文件上传临时路径
 */
 @Bean
 MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("/app/pttms/tmp");
    return factory.createMultipartConfig();
}
最终解决方案(当然也不一定就是你遇到的问题,只是我是这样解决的)

#spring boot 项目中,application.properties增加如下配置指定tomcat的基目录,否则spring boot内嵌的tomcat容器会创建一个临时目录,但是此目录有一个定期清除策略,会影响web容器资源的使用,所以指定在项目根目录创建目录
server.tomcat.basedir=./deployer/tomcat




猜你喜欢

转载自blog.csdn.net/kokjuis/article/details/79135440