• 【踩坑日记】springboot MultipartFile上传,@Async异步执行时报错:java,io.FileNotFoundException


    项目场景:

    springboot 项目中使用MultipartFile上传文件导入时,文件内容过大会导致页面等待时间较长,所以考虑使用上传文件时用@Async异步处理数据的方式来解决页面等待问题。


    问题描述

    给处理MultipartFile文件的方法添加@Async注解后,上传文件时出现异常,找不到临时文件

    异常如下:

    (org. springramework.web.multipart,MultipartFile,java.lang.Integer) throws java.io. IOExcept.onjava,io.FileNotFoundException: /tmp/tomcat,6802674863357158901,1070/work/Tomct/localhost/HHY/upload f5e77369 7db0 4bdd 8cf7 921ddb06e2b8 00000002.trp (No such file or directory)
    ream(DiskFileItem.java:194at org.apachetomcat .util.http.fileupload.disk.DiskFileltem.getInputSat org.apache.catalina.core.ApplicationPart.getInputStream(ApplicatioPart.java:100)at org.springframework.web .multipart .support.StandardMultipartHttpSerTetRequestsStandardMultipartFile.getBytes(StandardMultipartHttpServletRequest .jva:245) ......

    接口代码:

    1. @PostMapping("/importData")
    2. public Boolean importData(
    3. HttpServletResponse response,
    4. @RequestParam("file") MultipartFile file) {
    5. try {
    6. formatManagementService.importData(file);
    7. return true;
    8. } catch (IOException e) {
    9. e.printStackTrace();
    10. }
    11. return false;
    12. }
    13. // 异步处理导入的文件内容
    14. @Async
    15. public Boolean importData(MultipartFile file)
    16. throws IOException {
    17. // 文件内容处理逻辑
    18. ....
    19. }

    原因分析:

    首先:前端传递过来的文件,会存储到临时文件夹中,即上面报错的文件路径位置;但是如果方法是异步执行的时候,主线程结束,临时文件就会被清空,所以会报上面的异常:


    解决方案:

    所以这里我们如果要通过异步处理,就需要转换成输入流来操作,通过传参的方式将输入流传到异步方法内。在异步方法内使用完毕再释放输入流:

    代码如下:

    1. @PostMapping("/importData")
    2. public Boolean importData(
    3. HttpServletResponse response,
    4. @RequestParam("file") MultipartFile file) {
    5. try {
    6. formatManagementService.importData(file.getInputStream());
    7. return true;
    8. } catch (IOException e) {
    9. e.printStackTrace();
    10. }
    11. return false;
    12. }
    13. // 异步处理导入的文件内容
    14. @Async
    15. public Boolean importData(InputStream fileInputStream)
    16. throws IOException {
    17. try {
    18. // 文件内容处理逻辑
    19. ....
    20. } catch (Exception e) {
    21. log.error("导入异常", e);
    22. }finally{
    23. if (fileInputStream!=null){
    24. fileInputStream.close();
    25. }
    26. }
    27. }

    总结:

    @Async需要注意使用事项,例如像循环依赖调用的影响等问题;

    提醒:输入流对象在异步方法使用完后记得关闭流,否则会一直占用内存资源,并且服务器本地的缓存文件也无法更改或删除

  • 相关阅读:
    动态跳过测试用例
    【UI篇】Android 沉浸式状态栏的那些事
    【机器学习】鸢尾花数据的基本信息 || sklearn
    【LeetCode】876. 链表的中间结点—力扣
    Chrome开发者工具学习
    【图像融合】基于RP、CVT、DTCWT、NSCT-SR+DWT-SR+拉普拉斯金字塔算法-SR等实现MRT图像融合附matlab源码
    三七互娱,顺丰,康冠科技,金证科技24春招内推
    网上的搜索
    Session和Cookie
    数据结构与算法——算法时间复杂度
  • 原文地址:https://blog.csdn.net/huang_550/article/details/133135649