Spring上传文件java.lang.IllegalStateException: File has been moved - cannot be read again问题分析及解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27607579/article/details/77930632

问题分析:
Spring上传文件默认的文件上传处理器 CommonsMultipartResolver 这个类中使用了 common fileUpload 组件来进行文件的上传。
而 fileUpload 组件在进行文件上传时因为 java 内存有限,所以会先将较大的文件存放在硬盘中的一个临时目录中读取,而不是直接在内存中进行操作。
因此,在对较大文件进行分步骤操作时(例如对大小超过10M的图片进行缩略图生成处理),就会因为要读取的文件已经不存在于内存中而出现java.lang.IllegalStateException: File has been moved - cannot be read again 这个异常。

解决方案:
CommonsMultipartResolver 这个类中 maxInMemorySize 这个属性用来决定大小超多多大的文件会被放在硬盘中的临时目录而不是直接在内存中操作,所以我们调整这个数值的大小为超过我们要进行操作的文件的最大大小即可。

Spring MVC操作如下:
修改applicationcontext.xml文件中如下属性:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="104857600"/>
    <property name="maxInMemorySize" value="4096"/>//将此值设置为需要的大小即可
</bean>

Spring Boot操作如下:

@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver(){
     CommonsMultipartResolver resolver = new CommonsMultipartResolver();
     resolver.setMaxInMemorySize(20*1024*1024);//将此值设置为需要的大小即可,我这里设置为20M
     return resolver;
}   

不过小弟觉得我的解决方式过于简单粗暴,可能会有什么问题是我没考虑到的,如果各位前辈觉得我的处理方式不妥,还望各位前辈多多指点,先谢谢各位前辈了!

猜你喜欢

转载自blog.csdn.net/qq_27607579/article/details/77930632