当前位置: 首页 > 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…...

参数缺省和函数重载讲解

一路风雨兼程磨砺意志&#xff0c;三载苦乐同享铸就辉煌 目录 1.参数缺省的概念 2.参数缺省的用法 3.缺省参数分类 3.1.全缺省参数 3.2.半缺省参数 4.函数重载的概念 5.函数重载的用法 6.函数重载的原理 1.参数缺省的概念 一般情况下&#xff0c;函数调用时的实参个数应…...

关于召开2023第八届国际发酵培养基应用发展技术论坛的通知

生物发酵培养基是影响产业技术水平、环境友好程度的重要影响因素&#xff0c;为进一步实现生物发酵培养基的稳定可控、高效生产以及绿色安全&#xff0c;进一步推动生物技术的创新升级、绿色低碳循环生产&#xff0c;需要加强跨界联合&#xff0c;集中优势力量&#xff0c;突破…...

Java之深度优先(DFS)和广度优先(BFS)及相关题目

目录 一.深度优先遍历和广度优先遍历 1.深度优先遍历 2.广度优先遍历 二.图像渲染 1.题目描述 2.问题分析 3代码实现 1.广度优先遍历 2.深度优先遍历 三.岛屿的最大面积 1.题目描述 2.问题分析 3代码实现 1.广度优先遍历 2.深度优先遍历 四.岛屿的周长 1.题目描…...

【链表OJ题(四)】反转链表

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(四)1. 反转…...

java ArrayList源码分析(深度讲解)

ArrayList类的底层实现ArrayList类的断点调试空参构造的分步骤演示&#xff08;重要&#xff09;带参构造的分步骤演示一、前言大家好&#xff0c;本篇博文是对单列集合List的实现类ArrayList的内容补充。之前在List集合的万字详解篇&#xff0c;我们只是拿ArrayList演示了List…...

【网络编程】零基础到精通——NIO基础三大组件和ByteBuffer

一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 st…...

操作系统 - 1. 绪论

目录操作系统基本概念概念特征功能操作系统的分类与发展手工操作单道批处理系统多道批处理系统分时系统实时系统操作系统的运行环境CPU 运行模式中断和异常的处理系统调用程序的链接与装入程序运行时内存映像和地址空间操作系统的体系结构操作系统的引导操作系统基本概念 概念…...

详谈parameterType与resultType的用法

resultMap 表示查询结果集与java对象之间的一种关系&#xff0c;处理查询结果集&#xff0c;映射到java对象。 resultMap 是一种“查询结果集---Bean对象”属性名称映射关系&#xff0c;使用resultMap关系可将将查询结果集中的列一一映射到bean对象的各个属性&#…...

【Linux】进程概念、fork() 函数 (干货满满)

文章目录&#x1f4d5; 前言&#x1f4d5; 进程概念&#x1f4d5; Linux下查看进程的两种方法方法一方法二&#x1f4d5; pid() 、ppid() 函数&#x1f4d5; fork() 函数、父子进程初识再理解&#x1f4d5; fork做了什么&#x1f4d5; 如何理解 fork 有两个返回值&#x1f4d5;…...

【动态规划】最长上升子序列、最大子数组和题解及代码实现

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

wordpress $wpdb 查询/做一个微信小程序需要多少钱

文章目录一. 知识点1.1 网页请求1.2 django使用的模式 MTV1.3 django 模板语法1.4 django的一些技巧二. 数据表的设计(可以想成做Excel)2.1 表实际配置a 创建表b. 创建表的视图2.2 注意三. 注册-激活-登录-退出-登录3.1 注册流程3.2 用到的重要方法3.3 创建管理视图 admin.py3.…...

wordpress 更改标题/平台推广公众平台营销

文章目录一、栈实现计数器思路1、两个栈来保存字符2、比较优先级和计算3、过程会使用到的函数3.1、boolean recognize(char ch)区别是数字还是操作符3.2、int priority(char ch)&#xff0c;用来比较优先级3.3、int operateNum(int num1, int num2, char ch)二、用代码实现三、…...

wordpress播放m3u8/站长之家最新网站

1、Advanced Installer 2、Setup Factory 3、Smart Install Maker 企业应用的推荐&#xff1a; Nullsoft、InstallShield&#xff0c;Advanced Installer...

榆次做网站/百度首页优化排名

文章底部随意打赏作者&#xff0c;获取公号所有整理的案例资源&#xff01;当前视频讲解Scratch融合卡通、动画、音效等多媒体的运用和直观拖拽式的编程方式&#xff0c;生动有趣&#xff0c;可以编写各种类型程序&#xff0c;游戏、动画、互动美术、实物模拟、数学模拟等&…...

高校网站一般采用什么网页布局/互联网怎么赚钱

电脑A ip &#xff1a;192.168.1.186 电脑B ip :192.168.1.1 用电脑A 去链接电脑B的本地数据库 1.互相 ping 看能否访问 如图 &#xff08;判断是否在一个局域网&#xff09; 2.给电脑A授权创建用户 电脑B操作 允许用户myuser从ip为 192.168.1.186 的主机连接到mysql服务器&a…...

外贸建站cms/seo推广优化工具

SELECT * FROM 表名 limit m,n;SELECT*FROMtableLIMIT[offset,]rows;1.m代表从m1条记录行开始检索&#xff0c;n代表取出n条数据。(m可设为0)如&#xff1a;SELECT * FROM 表名 limit 6,5;表示&#xff1a;从第7条记录行开始算&#xff0c;取出5条数据2.值得注意的是&#xff0…...