当前位置: 首页 > news >正文

MultipartFile与File的互转

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* <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;
}

相关文章:

MultipartFile与File的互转

MultipartFile与File的互转前言MultipartFile转File1.FileUtils.copyInputStreamToFile转换2.multipartFile.transferTo(tempFile);3. (推荐&#xff09;FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());File转MultipartFile前言 需求是上传Excel文件并读取E…...

数据结构与算法基础-学习-15-二叉树

一、二叉树定义二叉树是N&#xff08;N>0&#xff09;个节点的有限集&#xff0c;它可能是空集或者由一个根节点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成。二、二叉树特点1、每个节点最多两个孩子。&#xff08;也就是二叉树的度小于等于2&#xff09;2…...

接口测试要测试什么?

一. 什么是接口测试&#xff1f;为什么要做接口测试&#xff1f; 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互…...

2023.03.12学习总结

项目部分写了内外菜单栏的伸缩&#xff0c;更新了导航栏&#xff0c;新增配置&#xff0c;scss变量 提交记录 学习了scss的使用和配置 &#xff0c;设置了scss全局变量&#xff0c;组件样式 给element-plus配置了主题颜色&#xff0c;配置到了全局 http://t.csdn.cn/FhZYa …...

数据结构入门6-1(图)

目录 注 图的定义 图的基本术语 图的类型定义 图的存储结构 邻接矩阵 1. 邻接矩阵表示法 2. 使用邻接矩阵表示法创建无向网 3. 邻接矩阵表示法的优缺点 邻接表 1. 邻接表表示法 2. 通过邻接表表示法创建无向图 3. 邻接表表示法的优缺点 十字链表&#xff08;有向…...

把C#代码上传到NuGet,大佬竟是我自己!!!

背景 刚发表完一篇博客总结自己写标准化C#代码的心历路程&#xff0c;立马就产生一个问题&#xff0c;就是我写好标准化代码后&#xff0c;一直存放磁盘的话&#xff0c;随着年月增加&#xff0c;代码越来越多&#xff0c;项目和版本的管理就会成为一个令我十分头疼的难题&…...

解决前端“\n”不换行问题

在日常开发过程中&#xff0c;换行显示是一种很常见的应用需求&#xff0c;但是偶然发现&#xff0c;有时候使用 "\n"并不会换行显示&#xff0c;只会被识别为空格&#xff0c;如下图。 通过上图可以看出&#xff0c;"\n"它被识别成了一个空格显示&#…...

Python打包成exe,文件太大问题解决办法(比保姆级还保姆级)

首先我要说一下&#xff0c;如果你不在乎大小&#xff0c;此篇直接别看了&#xff0c;因为我写过直接打包的&#xff0c;就多20M而已&#xff0c;这篇就别看了&#xff0c;点击查看不在乎大小直接打包这篇我觉得简单的令人发指 不废话&#xff0c;照葫芦画瓢就好 第1步&#…...

CSS弹性布局flex属性整理

1.align-items align-items属性&#xff1a;指定弹性布局内垂直方向的对齐方向。 常用属性&#xff1a; center 垂直居中展示 flex-start 头部对齐 flex-end 底部对齐 2. justify-content justify-content属性&#xff1a;属性&#xff08;水平&#xff09;对齐弹…...

14个你需要知道的实用CSS技巧

让我们学习一些实用的 CSS 技巧&#xff0c;以提升我们的工作效率。这些 CSS 技巧将帮助我们开发人员快速高效地构建项目。 现在&#xff0c;让我们开始吧。 1.CSS :in-range 和 :out-of-range 伪类 这些伪类用于在指定范围限制之内和之外设置输入样式。 (a) : 在范围内 如…...

【Flutter从入门到入坑之四】构建Flutter界面的基石——Widget

【Flutter从入门到入坑】Flutter 知识体系 【Flutter从入门到入坑之一】Flutter 介绍及安装使用 【Flutter从入门到入坑之二】Dart语言基础概述 【Flutter从入门到入坑之三】Flutter 是如何工作的 WidgetWidget 是什么呢&#xff1f;Widget 渲染过程WidgetElementRenderObjectR…...

中职网络空间安全windows渗透

目录 B-1&#xff1a;Windows操作系统渗透测试 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试&#xff0c;并将该操作显示结果中Telnet服务对应的端口号作为FLAG提交&#xff1b;​编辑 2.通过本地PC中渗透测试平台Kali对服务器场景Wind…...

普通二叉树的操作

普通二叉树的操作1. 前情说明2. 二叉树的遍历2.1 前序、中序以及后序遍历2.1.1 前序遍历2.1.2 中序遍历、后序遍历2.2 题目练习2.2.1 求一棵二叉树的节点个数2.2.2 求一棵二叉树的叶节点个数2.2.3 求一棵二叉树第k层节点的个数2.2.4 求一棵二叉树的深度2.2.5 在一棵二叉树中查找…...

Oracle:递归树形结构查询功能

概要树状结构通常由根节点、父节点&#xff08;PID&#xff09;、子节点&#xff08;ID&#xff09;和叶节点组成。查询语法SELECT [LEVEL],* FROM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDER BY 排序字段说明&#xff1a;LEVEL—伪列&#xff0…...

MongoDB数据库性能监控详解

目录一、MongoDB启动超慢1、启动日常卡住&#xff0c;根本不用为了截屏而快速操作&#xff0c;MongoDB启动真的超级慢~~2、启动MongoDB配置服务器&#xff0c;间歇性失败。3、查看MongoDB日志&#xff0c;分析“MongoDB启动慢”的原因。4、耗时“一小时”&#xff0c;MongoDB启…...

python不要再使用while死循环,使用定时器代替效果更佳!

在python开发的过程中&#xff0c;经常见到小伙伴直接使用while True的死循环sleep的方式来保存程序的一直运行。 这种方式虽然能达到效果&#xff0c;但是说不定什么时候就直接崩溃了。并且&#xff0c;在Linux环境中在检测到while True的未知进程就会直接干掉。 面对这样的…...

什么是接口测试?十年阿里测试人教你怎样做接口测试

一 什么是接口&#xff1f; 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。接口测试主要用于外部系统与系统之…...

1.10-1.12 Makefile

1. Makefile简介 举个栗子&#xff0c;如下为redis-5.0.10的项目目录&#xff0c;有很多的文件 有了Makefile文件&#xff0c;可以简单的make一下就可以对项目文件进行编译&#xff0c;最终生成可执行程序。 2. Makefile栗子1 首先&#xff0c;创建vim Makefile按照PPT里的格…...

Leetcode. 88合并两个有序数组

合并两个有序数组 文章目录归并思路二归并 核心思路&#xff1a; 依次比较&#xff0c;取较小值放入新数组中 i 遍历nums1 &#xff0c; j 遍历nums2 &#xff0c;取较小值放入nums3中 那如果nums[i] 和nums[j]中相等&#xff0c;随便放一个到nums3 那如果nums[i] 和nums[j]中相…...

【数据库】数据库查询(进阶命令详解)

目录 1.聚合查询 1.1聚合函数 COUNT函数 SUM函数 AVG函数 MAX函数 MIN函数 1.2GROUP BY子句 1.3HAVING 2.联合查询 2.1内连接 2.2外连接 2.3自连接 2.4子查询 3.合并查询 写在前面&#xff1a; 文章截图均是每个代码显示的图。数据库对代码大小写不敏感&am…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...

当下AI智能硬件方案浅谈

背景&#xff1a; 现在大模型出来以后&#xff0c;打破了常规的机械式的对话&#xff0c;人机对话变得更聪明一点。 对话用到的技术主要是实时音视频&#xff0c;简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术&#xff0c;开发自己的大模型。商用方案多见为字节、百…...