Java中MultipartFile与File互转的实现
作者:周全全 发布时间:2022-02-15 15:36:02
标签:Java,MultipartFile,File
前言
需求是上传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
* <p>
* 项目根路径创建临时文件,转换得到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
* <p>
* 项目根路径创建缓冲区来实现这个转换
*
* @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;
}
来源:https://blog.csdn.net/qq_29864051/article/details/129478353
0
投稿
猜你喜欢
- 前言:我们进行用maven 开发组件的时候,经常会遇到一种情况,我们添加一些maven依赖后,经常会出现本地原本正常的代码编译不过去下面我们
- spring cloud zuul增加header传输在使用OAuth2.0传输权限认证,为了再调用其他的项目的时候获取token,必须在t
- 1.让方法返回多个参数1.1在方法体外定义变量保存结果using System; using System.Collections
- 本文实例讲述了C#生成二维码的方法。分享给大家供大家参考。具体实现方法如下:首先引用ThoughtWorks.QRCode.dll具体代码如
- java 单例的五种实现方式及其性能分析序言在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式。从单例的五种实现方式中我们
- 本文实例讲述了java编程调用存储过程中得到新增记录id号的实现方法。分享给大家供大家参考,具体如下:关于ms sql server2000
- 目录一、Shiro简介 核心角色核心理念二、整合SpringBoot2框架 1、核心依赖2、Shiro核心配置3、域对象
- 使用 DateFormat 格式化日期、时间DateFormat 也是一个抽象类,它也提供了如下几个类方法用于获取 DateFormat 对
- 一、广播机制概述通常情况下在学校的每个教室都会装有一个喇叭,这些喇叭是接入到学校广播室的。如果有重要通知,会发送一条广播来告知全校师生。为了
- 为帮助开发者更方便、更安全地开发和调试基于微信的网页,微信推出了 web 开发者工具。它是一个桌面应用,通过模拟微信客户端的表现,使得开发者
- 本文介绍了spring整合JMS实现同步收发消息(基于ActiveMQ的实现),分享给大家,具体如下:1. 安装ActiveMQ注意:JDK
- 编码&解码 通过下图我们可以了解在javaWeb中有哪些地方有转码:用户想服务器发送一个HTTP请求,需要编码的地方有ur
- 微信公众号发送模版消息 背景:如下图,当用户发布需求的时候,公众号自定推送消息。例如:微信支付的时候,公众号会推送支付成功消息前提:发送模版
- 有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码List<Integer> list
- 题目要求思路一:DFS+序列化设计一种规则将所有子树序列化,保证不同子树的序列化字符串不同,相同子树的序列化串相同。用哈希表存所有的字符串,
- 前言:这段时间由于学校实行静态化管理,寝室门和校门都是用了人脸识别的装置,每次经过都会激发我的好奇心,也想自己搞一个人脸识别玩玩,随着开始查
- 本文实例讲述了Java开发之spring security实现基于MongoDB的认证功能。分享给大家供大家参考,具体如下:spring s
- 我们知道多线程因为同时处理子线程的能力,对于程序运行来说,能够达到很高的效率。不过很多人对于多线程的执行方法还没有尝试过,本篇我们将为大家介
- 在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘Java输入/输
- 我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘,就是我们 经常会在函数的参数里使用bool参数,这会大