MultipartFile与File的互转
创始人
2024-06-02 07:20:43

MultipartFile与File的互转

  • 前言
  • MultipartFile转File
    • 1.FileUtils.copyInputStreamToFile转换
    • 2.multipartFile.transferTo(tempFile);
    • 3. (推荐)FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
  • File转MultipartFile

前言

需求是上传Excel文件并读取Excel文件中的内容,根据获取的数据执行完某些业务操作后再将一些数据写回到excel中。前台使用FormData表单的方式请求后台,后台接收类型是MultipartFile,放置文件过大时会造成内存溢出需要转换为File类型

MultipartFile转File

其实转换的本质都是要创建一个file的临时文件,然后通过各种实现方式将MultipartFile中的内容写入到file中

1.FileUtils.copyInputStreamToFile转换

package com.cxstar.file.util;import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;/*** @author zhouquan* @description 测试MultipartFile与File互转* @date 2023-03-12 17:31**/
public class FileTestUtils {/*** MultipartFile转File* 

* 项目根路径创建临时文件,转换得到File,再删除临时文件** @param multipartFile* @return*/public static File multiPartFileToFile(MultipartFile multipartFile) throws IOException {//获取文件名String originalFilename = multipartFile.getOriginalFilename();//获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径String tempDir = System.getProperty("user.dir");//根目录下生成临时文件File file = new File(tempDir+File.separator+originalFilename);FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);return file;}}

此种方式的弊端就是需要在调用此方法后需要再手动删除,也就是要在业务代码中再掺杂删除的逻辑。

2.multipartFile.transferTo(tempFile);

/*** MultipartFile转File* 

* 项目根路径创建缓冲区来实现这个转换** @param multipartFile* @return*/public static File multiPartFileToFile2(MultipartFile multipartFile) throws IOException {//获取文件名String originalFilename = multipartFile.getOriginalFilename();//获取默认定位到的当前用户目录("user.dir"),也就是当前应用的根路径String tempDir = System.getProperty("user.dir");//获取文件名String filename = StringUtils.substringBeforeLast(originalFilename, ".");//获取文件后缀String fileExt = StringUtils.substringAfterLast(originalFilename, ".");//在项目根路径生成临时文件File tempFile = File.createTempFile(filename, "." + fileExt, new File(tempDir));multipartFile.transferTo(tempFile);//在jvm退出时执行删除此路径下的文件tempFile.deleteOnExit();return tempFile;}

注意:
1.防止生成的临时文件,createTempFile()方法会在文件名后添加随机码
2.生成的文件不会立马删除,而是在jvm退出时执行删除此路径下的文件
在这里插入图片描述

3. (推荐)FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());

package com.cxstar.file.util;import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.*;/*** @author zhouquan* @description 测试MultipartFile与File互转* @date 2023-03-12 17:31**/
public class FileTestUtils {/*** MultipartFile 转 File** @param multipartFile* @throws Exception*/public static File multiPartFileToFile3(MultipartFile multipartFile) {File file = null;if (multipartFile.isEmpty()) {return null;}try {//本质上还是在项目根路径创建文件file = new File(multipartFile.getOriginalFilename());//将MultipartFile的byte[]写入到file中FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());} catch (IOException e) {e.printStackTrace();}return file;}
}

此种方式相较于第二种方式,文件名不会发生改变,当然还是要手动删除
在这里插入图片描述

File转MultipartFile

MultipartFile文件上传时,其实springmvc已经转为StandardMultipartFile子类型

org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile

在这里插入图片描述

MultipartFile是一个接口,因此转成MultipartFile格式需要转成实现MultipartFile接口的实现类即可
在这里插入图片描述

package com.cxstar.file.util;import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileInputStream;/*** @author zhouquan* @description 测试MultipartFile与File互转* @date 2023-03-12 17:31**/
public class FileTestUtils {public static MultipartFile getMultipartFile(File file) throws Exception {MultipartFile multipartFile = new MockMultipartFile(file.getName(), new FileInputStream(file));return multipartFile;
}

相关内容

热门资讯

俄乌局部停火,泽连斯基:乌防空... 据新华社报道,国际原子能机构16日发表声明说,已促成俄罗斯和乌克兰局部停火,以修复扎波罗热核电站受损...
镜观·回响丨生态美,旅游兴——... 查干湖是我国十大淡水湖之一  大部分位于吉林省松原市境内  四季风光秀丽、渔产资源丰富  因保留北方...
唐鸿胪井碑理应归还中国 转自:人民日报  20世纪初,关重忠拍摄的在旅顺原址的唐鸿胪井碑及碑亭。  日本宫内厅公布的唐鸿胪井...
王亚联任鹰潭市委书记 转自:中国经济网综合中国经济网鹰潭1月17日综合报道 1月17日下午,江西省鹰潭市召开领导干部大会,...
科学家发现大脑“刹车”机制 据欧洲新闻社马德里1月12日电,我们都曾有过艰难迈出第一步的经历:需要打一个重要电话、写一份报告,或...