转载

MultipartFile 转File的几种方式

温馨提示:
本文最后更新于 2024年02月27日,已超过 66 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我


前言

最近写项目有个需求是上传Excel文件并读取Excel文件中的内容,项目采用的是前后端分离的模式,前端采用FormData形式提交后台,后台接收类型是MultipartFile,但是我读取文件的时候类型是File,因为直接从MultipartFile里面获取流进行处理,文件过大时会造成内存溢出,所以需MultipartFile转File


一、MultipartFile转File

在将 MultipartFile 类型转换为file类型 时,一般都是新建临时文件夹,然后将其转换,可以指定路径新建,也可以建在项目根目录


二、代码示例


1.第一种方式

创建一个临时路径,转换之后得到File,然后再将其删除

File file = new File(path); 

FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);  

2.第二种方式

此方法我在尝试的过程中一直报错,没成功,百度看到有这种方式,所以记录一下

public File transferToFile(MultipartFile multipartFile) {
//        选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            String[] filename = originalFilename.split("\\.");
            file=File.createTempFile(filename[0], filename[1]);
            multipartFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
 

3.第三种方式

这种方式会把上传的文件放到项目的根目录下,也要记得删啊

public File multipartFileToFile(MultipartFile file) throws Exception {
        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(file.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;

    }



 private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            throw new ToLogException("读取文件错误", e);
        }
    }

总结

根据自己项目的需求选择一种方式吧,我是采用的第一种,代码比较简单

后续~

其实本身写这篇文章的时候只是单纯想记录一下,但是没想到被不少人收藏,也有一些童鞋给出了一些完善的观点,那我就再完善一下吧

1.首先第二种方式改为如下:

public File transferToFile(MultipartFile multipartFile) {
//        选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
        File file = null;
        try {
            String originalFilename = multipartFile.getOriginalFilename();
            String[] filename = originalFilename.split("\\.");
            file=File.createTempFile(filename[0], filename[1] + ".");
            multipartFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

filename[1]后面追加.

2.直接使用transferTo转换

// 先保存到临时文件夹下,操作完成之后进行删除
			String filePath = Constants.TMP_PATH + DateUtil.getDateDir() + FileUtil.getFileName() + "." + suffix;
			File targetFile = new File(filePath);
			if (!targetFile.exists()) {
				targetFile.mkdirs();
			}
			multipartFile.transferTo(targetFile);

其实这个跟第二种方式差不多,如果上传的是临时文件的话,其实还是得删除的

正文到此结束