最近做的功能涉及到解析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);
......
}