我一定写了一个假的技术博客
当前位置: 首页>> 技术宅 >> 正文

MultipartFile转CommonsMultipartFile强转失败的解决办法

2020年02月26日 2 条评论 ... 技术宅 /

SpringBoot 中通过 Http 接收到的文件形式不是常用的 File 对象,而是 MultipartFile 对象,因为业务需要,想把文件转换成 File 格式的对象,并进行后续转存的操作。

这个问题拿到搜索引擎上搜索,得到了两个方案,其中一个不需要存成文件直接转换的方案吸引了我,毕竟节约硬盘操作的方法又快又简单,岂不美哉。但是如果真的这么做了,写的代码大概是这样的:

  1. @PostMapping("/parseImage")  
  2.     public String parseImage(@RequestParam MultipartFile uploadFiles) throws IOException{  
  3.         CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) uploadFiles;  
  4.         File targetFile = (File) commonsMultipartFile.getFileItem();  
  5.         // 其他代码...  
  6.         return "result";  
  7.     } 

 

如果运行,大概就会得到这样的错误,错误如下:

org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile cannot be cast to org.springframework.web.multipart.commons.CommonsMultipartFile

错误意思是两个对象无法进行强转,出错的代码如下:

CommonsMultipartFile commonsMultipartFile  = (CommonsMultipartFile) uploadFiles;

搜索了其他各种解决方法,基本上都是一大抄,文章都是某个无名英雄写的,被抄的全网都是。

最后解决方案只能是妥协,放弃不生成文件的执念,创建了临时文件来解决,使用 MultipartFile 封装的 transferTo() 方法来将文件转换为 File 对象,转换方法的代码如下:

  1. private File multipartFileToFile(MultipartFile dataFile) throws IOException {  
  2.         if (!dataFile.isEmpty()) {  
  3.             String filename = dataFile.getOriginalFilename();  
  4.             String[] fileIngredent = filename.split("\\.");  
  5.             File f = File.createTempFile(fileIngredent[0], "."+fileIngredent[1]);  
  6.             // 将mutipartFile转换成file  
  7.             dataFile.transferTo(f);  
  8.             // 删除临时文件  
  9.             /*if(file.exists()){  
  10.                 file.delete();  
  11.             }*/ 
  12.             return f;  
  13.         }  
  14.         return null;  
  15.     } 

至于网上抄遍地的强转的方法为啥不管用,暂时还没有细追究,我使用的 SpringBoot 版本为 2.0.6.RELEASE 。

版权保护: 本文由 唐野 原创,转载请保留链接: http://www.yelook.com/2343.html

2 条吐槽

Loading...
  1. 今日头条新闻

    文章不错非常喜欢

    2020-02-28 [回复]
  2. 1111

    如果你只是需要InputStream,请把poi版本升到最新,我现在是4.1.2。踩了3天坑,发现是版本太低了,我吐了。

    2022-01-9 [回复]

发布评论