异常java.lang.IllegalStateException: File has been moved - cannot be read again

最近做的功能涉及到解析excel,解析文件时,每次调用multipartFile.getInputStream(),就会出异常java.lang.IllegalStateException: File has been moved - cannot be read again。

 

SpringMVC上传文件时,需要配置MultipartResolver处理器

maxUploadSize:单个请求的最大上传大小。这意味着所有上传文件的总大小不能超过这个配置的最大值。默认值是无限的(值为-1)。但是我们可以通过maxUploadSize及其value属性来设置它。

maxInMemorySize:小于这个值的文件存储在内存中,否则它们将直接存储在磁盘中。默认值是10 KB(10240字节)。或者你可以通过maxInMemorySize和它的值属性对它进行定制。

 

<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> 
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">   
    <property name="defaultEncoding" value="UTF-8"/> 
    <!-- 指定所上传文件的总大小不能超过1M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 --> 
    <property name="maxUploadSize" value="1000000"/>
    <!-- 最大内存大小 (40960)--> 
    <property name="maxInMemorySize" value="40960" />
</bean>

我的配置中,maxInMemorySize =40960b ,也就是40Kb,为了验证是不是配置的问题,分别上传不同的文件,结果发现,当我上传的文件大于40kb时,multipartFile调用getInputStream()方法就会抛出异常。

 

我理解的意思是,文件小于40kb时,在内存中读取,文件存在。大于40kb是,就不能从内存中读取了,需要从硬盘直接读取,内存中没有数据,这时候调用getInputStream()必然要抛异常了。

 

对于这个问题,我尝试了两种解决方案,均是可行的:

 

一是改配置文件,设置文件的最大内存大小为大的值

<!-- 最大内存大小 (4096000)--> 
<property name="maxInMemorySize" value="4096000" />

 

二是将multipartFile转换为file,通过new FileInputStream(file) 获取inputstream

 

public String parseFile(MultipartFile mulfile){
    // 获取文件名
    String fileName = mulfile.getOriginalFilename();
    // 获取文件后缀
    String prefix = fileName.substring(fileName.lastIndexOf("."));
    // 创建文件
    File excelFile = File.createTempFile(fileName, prefix);
    // MultipartFile 转换 File:mulfile ---->File
    mulfile.transferTo(excelFile);
    ......
 } // MultipartFile 转换 File:mulfile ---->File
    mulfile.transferTo(excelFile);
    ......
 }

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值