byte[]、MultipartFile、File转换

需求背景

当你需要将byte[]、MultipartFile、File实现互转时,无外乎以下场景:

保存第三方接口返回二进制流

前/后端文件流上传

微服务间调用

文件格式转换

byte[]转MultipartFile

错误示例-MockMultipartFile

首先来看一下摘自Spring官网对MockMultipartFile的一段描述:

public class MockMultipartFile extends Object implements MultipartFile
Mock implementation of the MultipartFile interface. Useful in
conjunction with a MockMultipartHttpServletRequest for testing
application controllers that access multipart uploads.

虽然MockMultipartFile实现了MultipartFile接口,重点在于后一句对其作用的描述:用于测试访问分段上传, 所以这个类在正式环境是无法使用的,在我看来使用MockMultipartFile来实现byte[]转MockMultipartFile的博客都是误人子弟,因为你的代码不仅仅是运行在测试类中,而都是要发布在生产环境的。

maven坐标:


<!-- https://mvnrepository.com/artifact/org.springframework/spring-mock -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-mock</artifactId><version>2.0.8</version><scope>test</scope>
</dependency>
byte[] testFile = new byte[1024];
InputStream inputStream = new ByteArrayInputStream(testFile);
MultipartFile file = new MockMultipartFile(ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);

CommonsMultipartFile介绍

CommonsMultipartFile是 Spring 框架3.1版本后引入,用于与Apache Commons FileUpload 库集成的适配器。它实现了 Spring 的 MultipartFile 接口,允许你将Apache Commons FileUpload 的 FileItem 对象作为 Spring 的 MultipartFile 来使用。

CommonsMultipartFile实现

以maven的方式如何引入CommonsMultipartFile:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>

实现代码:

private static MultipartFile convertByteToMultipartFile(byte[] imageBytes,String fileName) {if (Objects.isNull(imageBytes)) {log.error("获取微信小程序码图片信息失败,接口返回为空");throw new CustomException("由于输入byte数组为空,导致转换为MultipartFile失败");}String contentType = "image/jpeg";FileItem item;try {FileItemFactory factory = new DiskFileItemFactory();item = factory.createItem("file", contentType, false, fileName);try (ByteArrayOutputStream bos = new ByteArrayOutputStream(imageBytes.length);OutputStream os = item.getOutputStream()) {bos.write(imageBytes);os.write(bos.toByteArray());}return new CommonsMultipartFile(item);} catch (IOException e) {log.error("转换微信小程序码图片信息为MultipartFile时发生错误", e);throw new CustomException("转换过程中发生错误", e);}
}

byte[]转File

byte[]转File的实现方式更多一些,很多第三方高质量的轮子提供了均对应的方法,无需自行实现,调用API即可,下文以HuTool``与Apache Commons lang3举例。

前置条件-获取文件byte[]

以下代码从本地读取文件并转为byte[]用于模拟业务逻辑。


/*** 将文件内容读取到字节数组中。** @param filePath 文件路径* @return 字节数组,如果文件不存在或读取过程中发生错误,则返回null*/public static byte[] getFileBytes(String filePath) {File file = new File(filePath);// 检查文件是否存在if (!file.exists()) {System.out.println("文件不存在");return null;}try (// 使用try-with-resources语句自动管理资源FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel()) {// 分配一个ByteBuffer,大小为文件的大小ByteBuffer byteBuffer = ByteBuffer.allocate((int) fileChannel.size());// 从文件通道读取数据到ByteBufferfileChannel.read(byteBuffer);// 反转ByteBuffer的limit和position,使得可以通过array()方法获取数据byteBuffer.flip();// 返回包含文件数据的字节数组return byteBuffer.array();} catch (IOException e) {// 如果发生IO异常,记录错误日志并返回nulle.printStackTrace(); // 这里假设e.printStackTrace()是日志记录的一种形式return null;}}
}

以Hutool的方式

引入Hutool

以maven坐标的方式:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version>
</dependency>

以Gradle的方式:

implementation 'cn.hutool:hutool-all:5.8.26'
byte[] data = getFileBytes("src/main/resources/banner.txt");
// 指定要创建的文件路径
String filePath = "/path/to/your/output/file";
// 使用HuTool将byte数组写入到文件
File file = FileUtil.writeBytes(data, filePath);

以Apache Commons IO的方式

引入Apache Commons IO

以maven坐标的形式:

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.16.1</version>
</dependency>

以Gradle的形式:

implementation 'commons-io:commons-io:2.16.1'

代码实现:

public static void main(String[] args) {try {//业务逻辑中获取到的byte[]byte[] fileBytes = getFileBytes("src/main/resources/banner.txt");//目标文件String outputFilePath = "src/main/resources/banner22.txt";File outputFile = writeBytesToFile(outputFilePath, fileBytes);log.error("文件写入成功,输出文件路径: {}", outputFile.getAbsolutePath());} catch (IOException e) {log.error("转换错误", e);}
}public static File writeBytesToFile(String filePath, byte[] fileBytes) throws IOException {File outputFile = new File(filePath);FileUtils.writeByteArrayToFile(outputFile, fileBytes);// 返回File对象return outputFile;
}

MultipartFile与File互转

字节数组可以转换为File,同样也可以转换为MultipartFile,那么MultipartFile与File之间的互转可以利用byte[]作为中间桥梁。

MultipartFile转File

MultipartFile接口提供了getInputStream()方法,你可以使用这个方法来读取文件内容,并将它们写入到一个新的File对象中。

public class MultipartFileToFileConverter {public static File convert(MultipartFile multipartFile, String filePath) throws IOException {// 检查MultipartFile是否为空if (multipartFile == null || multipartFile.isEmpty()) {throw new IOException("文件为空");}// 创建File对象File file = new File(filePath);// 使用try-with-resources语句自动关闭资源try (InputStream inputStream = multipartFile.getInputStream();FileOutputStream outputStream = new FileOutputStream(file)) {// 将输入流中的数据写入到输出流(即文件)中byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}// 返回创建的File对象return file;}
}

File转MultipartFile

File转MultipartFile同样需要依赖于CommonsMultipartFile。

public class FileToMultipartFileConverter {public static MultipartFile convert(File file) throws IOException, FileUploadException {// 创建FileItemFactory实例FileItemFactory factory = new DiskFileItemFactory();// 创建一个FileItem来包装File对象org.apache.commons.fileupload.FileItem fileItem = factory.createItem("file", // 表单字段名,可以自定义"application/octet-stream", // 内容类型true, // 是否使用临时文件存储上传的数据file.getName() // 文件名);// 将File对象的内容写入到FileItem中fileItem.write(new File(fileItem.getName()));// 使用CommonsMultipartFile来包装FileItemreturn new DiskFileItem(fileItem).getStoreLocation();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精益生产推进时如何营造持续变革的氛围?

在快速变化的市场环境中&#xff0c;企业如何保持竞争力&#xff1f;精益生产无疑为众多企业提供了一个强大的战略工具。但是&#xff0c;单纯的引入精益生产理念和方法并不能保证企业的持续成功。关键在于如何营造一种持续变革的氛围&#xff0c;让精益生产成为推动企业不断前…

SDN控制器有哪些推荐品牌?

SDN控制器是SDN架构中的核心组件&#xff0c;负责管理网络设备并实现网络策略。随着SDN技术的不断发展&#xff0c;市场上出现了多种SDN控制器&#xff0c;它们来自不同的供应商&#xff0c;各有特色。以下是一些知名的SDN控制器品牌和产品&#xff1a; 1. **OpenDaylight**&a…

智慧校园-宿舍管理系统总体概述

在教育信息化的不断推动下&#xff0c;智慧校园宿舍管理系统脱颖而出&#xff0c;它以一种全新的视角和方式&#xff0c;重塑了高校宿舍管理的传统模式。该系统深度融合了云计算、物联网、大数据等先进科技&#xff0c;旨在为学生提供一个既安全可靠又充满便捷与温馨的居住体验…

Node.js全栈指南:认识MIME和HTTP

MIME&#xff0c;全称 “多用途互联网邮件扩展类型”。 这名称相当学术&#xff0c;用人话来说就是&#xff1a; 我们浏览一个网页的时候&#xff0c;之所以能看到 html 文件展示成网页&#xff0c;图片可以正常显示&#xff0c;css 样式能正常影响网页效果&#xff0c;js 脚…

Arduino - 电磁锁

Arduino - Electromagnetic Lock Arduino - 电磁锁 The electromagnetic lock (EM lock) is widely used to lock the door. It is usually used with switch, fingerprint reader, RFID/NFC reader, keypad, or application on PC/mobille to control access to door, buid…

气膜体育馆对高度的要求—轻空间

在现代体育场馆的建设中&#xff0c;气膜体育馆以其独特的优势&#xff0c;逐渐成为人们关注的焦点。不同于传统的钢筋混凝土结构&#xff0c;气膜体育馆以其轻盈、灵活、环保的特点&#xff0c;为人们带来了全新的体育体验。在设计与建设气膜体育馆时&#xff0c;高度是一个关…

爬虫是什么?

目录 1.什么是互联网爬虫&#xff1f; 2.爬虫核心? 3.爬虫的用途? 4.爬虫分类&#xff1f; 5.反爬手段&#xff1f; 1.什么是互联网爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序…

Hadoop简单应用程序实例

Hadoop是一个分布式系统基础架构&#xff0c;主要用于大数据的存储和处理。它允许使用简单的编程模型跨集群处理和生成大数据集。Hadoop主要由HDFS&#xff08;Hadoop Distributed FileSystem&#xff0c;分布式文件系统&#xff09;和MapReduce编程模型两部分组成。 准备工作…

第十节 动态面板实现推动和拉动效果

在原型设计中我们经常会遇到元件使用显示更多或者收起效果,下面以面板元件推动与拉动效果做案件说明。 一、设置原有内容 我这里添加一个表格内容,添加“显示更多”文本超链接 二、设置在更多显示面板内容 添加一个动态面板,设置有内容、无内容两个状态 在有内容面板中添…

WDF驱动开发-WDF总线枚举

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统&#xff0c;而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备&#xff0c;并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线…

TEMU半托管模式引领跨境电商新风尚

TEMU半托管模式作为2024年的热门话题&#xff0c;正吸引着越来越多卖家的目光。继全托管模式取得巨大成功之后&#xff0c;半托管模式的推出无疑为跨境电商行业注入了新的活力。 在选品方向上&#xff0c;TEMU半托管模式强调商品的聚焦与精选。卖家在选择上架商品时&#xff0c…

python AI全栈工程师

python AI全栈工程师 前端&#xff1a;Streamlit Streamlit是一个开源的Python库&#xff0c;专为数据科学家和机器学习工程师设计&#xff0c;用于快速构建交互式用户界面。Streamlit功能强大、易于使用&#xff0c;特别适合数据科学家和机器学习工程师快速构建和部署交互式数…

在项目中使用 VitePress 作为文档常见问题:样式丢失,图标丢失,打包错误,中文配置修改等

本文总结和记录自己在使用 vitepress 作为 Vue 项目文档时遇到的问题&#xff0c;以及解决方法。直接进入正题&#xff1a; md 文档中引入组件部分样式丢失 默认你导入的 vue 文件的 style 标签里的样式会生效&#xff0c;但是样式之外的样式不会生效&#xff0c;需要手动引入…

nodejs国内源下载

nodejs的官网下载太慢了 可以尝试网盘下载快一点 夸克网盘分享夸克网盘是夸克推出的一款云服务产品&#xff0c;功能包括云存储、高清看剧、文件在线解压、PDF一键转换等。通过夸克网盘可随时随地管理和使用照片、文档、手机资料&#xff0c;目前支持Android、iOS、PC、iPad。…

AI产品经理如何快速接手一个新产品?

我们到一家新的公司&#xff0c;往往都有现成的产品需要你熟悉&#xff0c;这个对你来说就是一个新产品。 又或者说&#xff0c;公司要搭建一个新的项目&#xff0c;让你负责&#xff0c;需要你从0开始去接手&#xff0c;最终去上线&#xff0c;去推广&#xff0c;去盈利&…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【14】缓存与分布式锁

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【14】缓存与分布式锁 缓存本地缓存分布式缓存-本地模式在分布式下的问题分布式缓存整合 redis 作为缓存JMeter测试出OutOfDirectMemoryError【堆外内存溢出】 高并发读下缓存失效问题缓存…

基于YOLOv5+PyQT5的吸烟行为检测(含pyqt页面、模型、数据集)

简介 吸烟不仅对个人健康有害,也可能在某些特定场合带来安全隐患。为了有效地监控公共场所和工作环境中的吸烟行为,我们开发了一种基于YOLOv5目标检测模型的吸烟检测系统。本报告将详细介绍该系统的实际应用与实现,包括系统架构、功能实现、使用说明、检测示例、数据集获取…

UDS - 10.2 DiagnosticSessionControl (10) service

10.3 诊断会话控制(10)服务 来自:ISO 14229-1-2020.pdf 10.2.1 服务说明 DiagnosticsSessionControl服务用于在服务器中启用不同的诊断会话。 诊断会话启用服务器中的一组特定诊断服务和/或功能。该服务提供了服务器可以报告对启用的诊断会话有效的数据链路层特定参数值(…

ZAP安全扫描工具

下载地址: 去官网下载&#xff1a;https://www.zaproxy.org/download/ 1.主动扫描 需要登录的网站建议使用主动扫描 也可以绕过登录进行手动扫描 再选择手动扫描后 获取到对应的token 2.自动扫描 3.查看报告 4.扫描策略的使用

.gitignore git添加忽略文件

在项目的根目录下创建一个名为 .gitignore 的文件。在这个文件中&#xff0c;列出您希望Git忽略的文件和文件夹的名称或模式。 下面是一些基本的步骤和规则&#xff1a; 创建 .gitignore 文件&#xff1a;在项目根目录下创建一个名为 .gitignore 的文件。如果没有这个文件&…