Spring boot 上传文件java.io.IOException: java.io.FileNotFoundException 异常


https://kerry.blog.csdn.net/article/details/80366438

 

spring boot实现文件上传,刚开始同步实现,没有问题,后来耗时太长,改成异步实现,但是异步实现,在上传过程中发现报错,

类似下面的堆栈:

java.io.IOException:java.io.FileNotFoundException: /var/private/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/source/IMG_20160129_132623.tmp(No such file or directory)

表面看了,是一个临时文件找不到,我以为目录没有,尝试创建临时文件需要的目录,发现也不行。

后来百度有人说是内存文件最大size 的设置不对,默认设置比较大,如果小于这个值,不会创建临时文件,所以,修改这个参数

setInMemorySize为1,但是还是不行。

其实现在看来,不是这个问题,唯一的变动就是同步改成异步操作。后来google发现终于找到原因了,分享给大家。

原因: 跟临时文件找不到没有关系,原因在于异步操作上传是,请求流已经关闭了,所以异步上传过程中会失败。

方案:在主线程保存全部文件流,在异步线程中进行处理。完美解决!!!

参考代码如下:

保存全部文件流数据在byte数组:

List<Object> list = new ArrayList<>();
for (MultipartFile fileTmp : file) {
try {
byte[] bytes1 = IOUtils.toByteArray(fileTmp.getInputStream());
list.add(bytes1);
} catch (Exception e) {
log.error("Failed to convert image stream to byte array:{}", e);
}
}
qiniuService.uploadImageToQiniu(list, fileNameList, user, idNoValidParam);
传入异步线程进行上传,此处上传到七牛云服务

@Async
public void uploadImageToQiniu(List<Object> list, List<String> fileNameList, User user,IdNoValidParam idNoValidParam ) {
String qiNiuUrl = syscodeService.getValueByKey(Constants.QINGNIU_URL);
//上传图片到qiniu cloud
for (Object object:list) {
byte[] bytes = (byte[]) object;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
try {
ImageUtils imageUtils = new ImageUtils();
imageUtils.saveImgToQiNiu(byteArrayInputStream, fileNameList);
log.info("upload image successfully{}");
} catch (IOException e) {

log.error("save image error {}", e);

}
}

}

————————————————
版权声明:本文为CSDN博主「hanruikai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hanruikai/article/details/80366438


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM