Java 处理base64文件上传

场景:

        在系统内有一个类似于公告的模块,如果里面添加的文章不是选择富文本上传图片的方式,而是选择复制别的文章直接粘贴到系统内的富文本,里面的图片就不会是url,而是图片的base64格式,这样会导致数据库存储压力过大,数据接口处理缓慢等问题...

解决:

        前端在进行检索校验,如果检测到了base64格式的文件就单独去走后台的接口,后台需要出一个单独处理base64文件上传的接口,将base64数据转化成文件进行上传,然后返回存储目标地址的url路径返回给前端,让前端在富文本里面去进行展示

代码:

controller

/*** 通用上传请求(单个)*/@ApiOperation(value = "上传文件(仅接收 Base64)")@PostMapping("/uploadBase64")public Base64UploadResponse uploadFileBase64(@RequestBody String base64Data){// 定义数据的返回。因为前端处理富文本的时候用了一个单独的框架,需要按照那个框架进行相应的数据返回,所以才怎么写的Base64UploadResponse.Data data = new Base64UploadResponse.Data("", "", "","图片编码不能为空!");// 返回值code定义int resultCode = 0;// 非空判断if(base64Data.isEmpty()){// 异常返回data = new Base64UploadResponse.Data("", "", "","图片编码不能为空!");return new Base64UploadResponse(resultCode,data);}// 图片上传Map<String, String> returnFileBase64 = ossUploadFileUtils.uploadPublicBase64(base64Data);// 返回值判断if(returnFileBase64.isEmpty()){data = new Base64UploadResponse.Data("", "", "","图片编码解析或上传异常!");}else{resultCode = 200;data = new Base64UploadResponse.Data(returnFileBase64.get("url"), returnFileBase64.get("fileName"), "","图片上传成功!");}// 返回给前端return new Base64UploadResponse(resultCode,data);}

返回对象:


/*** 操作消息提醒*/
public class Base64UploadResponse {private int errno; // 错误码,必须是数字private Data data; // 嵌套的 data 对象// 内部静态类,用于 data 字段public static class Data {private String url; // 图片 URL,必须private String alt; // 图片描述文字,非必须private String href; // 图片链接,非必须private String msg; // 消息,非必须// 构造函数public Data(String url, String alt, String href, String msg) {this.url = url;this.alt = alt;this.href = href;this.msg = msg;}// Getters 和 Setterspublic String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getAlt() {return alt;}public void setAlt(String alt) {this.alt = alt;}public String getHref() {return href;}public void setHref(String href) {this.href = href;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}// 构造函数public Base64UploadResponse(int errno, Data data) {this.errno = errno;this.data = data;}// Getters 和 Setterspublic int getErrno() {return errno;}public void setErrno(int errno) {this.errno = errno;}public Data getData() {return data;}public void setData(Data data) {this.data = data;}
}

utils:

/*** base64文件格式数据转换*/public Map<String, String> uploadPublicBase64(String base64Data) {try {// 检查是否包含前缀,并移除它if (base64Data.startsWith("data:image/png;base64,")) {base64Data = base64Data.replace("data:image/png;base64,", "");}// 解码 Base64 数据byte[] fileData = Base64.getDecoder().decode(base64Data);// 自动生成文件名String generatedFilename = "file_" + System.currentTimeMillis() + ".bin";// 将字节数据转换为 MultipartFileMultipartFile file = new Base64ToMultipartFile(fileData, generatedFilename);// 将base64转化成对应的上传文件的格式就可以走系统内的上传方法了,然后将返回的数据返回给前端就可以正常展示了Map<String, String> stringStringMap = uploadPublic(file);return stringStringMap;} catch (Exception e) {return null;}}

import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;public class Base64ToMultipartFile implements MultipartFile {private final byte[] fileContent;private final String originalFilename;public Base64ToMultipartFile(byte[] fileContent, String originalFilename) {this.fileContent = fileContent;this.originalFilename = originalFilename;}@Overridepublic String getName() {return originalFilename;}@Overridepublic String getOriginalFilename() {return originalFilename;}@Overridepublic String getContentType() {// 根据需要返回 MIME 类型return "application/octet-stream";}@Overridepublic boolean isEmpty() {return fileContent.length == 0;}@Overridepublic long getSize() {return fileContent.length;}@Overridepublic byte[] getBytes() {return fileContent;}@Overridepublic InputStream getInputStream() {return new ByteArrayInputStream(fileContent);}@Overridepublic void transferTo(java.io.File dest) throws IOException {throw new UnsupportedOperationException("This operation is not supported.");}
}

注:

       !数据转码异常问题

# 我在别的系统同样也使用该功能,发现我的
MultipartFile file = new Base64ToMultipartFile(fileData, generatedFilename);
# 不是每次都能正常转化,所以我又切换了一种方法/*** base64文件格式数据转换*/#  这个参数可以不用管,没什么作用public static String uploadPublicBase64(String filePath, String base64Data) {try {// 检查是否包含前缀,并移除它if (base64Data.startsWith("data:image/png;base64,")) {base64Data = base64Data.replace("data:image/png;base64,", "");}// 解码 Base64 数据byte[] fileData = Base64.getDecoder().decode(base64Data);// 自动生成文件名String generatedFilename = "file_" + System.currentTimeMillis() + ".png"; // 假设是PNG文件// 创建 MultipartFile(使用 MockMultipartFile)MockMultipartFile file = new MockMultipartFile("file",                    // 参数名generatedFilename,               // 文件名"image/png",                     // 文件类型fileData                         // 文件内容);// 上传文件逻辑String result = upload(filePath, file); // 调用上传方法return result;} catch (Exception e) {e.printStackTrace();return null;}}

返回结果:

正常传入base64就会返回上传后对应的图片的信息。

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

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

相关文章

【行业发展报告】2024大数据与智能化行业发展浅析

回首 2024&#xff0c;大数据智能化浪潮汹涌。海量数据宛如繁星&#xff0c;在智能算法的苍穹下汇聚、碰撞&#xff0c;释放出洞察市场与用户的强大能量&#xff0c;精准勾勒出商业新航线。我们精心雕琢技术架构&#xff0c;从数据存储的坚固基石到处理分析的高效引擎&#xff…

C++ 设计模式:享元模式(Flyweight Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 单例模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过共享尽可能多的相同对象来减少内存使用和提高性能。享元模式适用于大量细粒度对象的场景&#xff0c;这些对象之…

项目基本配置

总说 本节主要记录修改配置文件、连接mysql数据库、git连接 一、配置文件的修改 1.1 配置pom.xml 由于我们要连接mysql数据库&#xff0c;需要在pom.xml中添加相关依赖 这里给出一个网站&#xff0c;可以找到各种依赖Maven Repository: Search/Browse/Explore 添加一个my…

【YOLOv3】源码(train.py)

概述 主要模块分析 参数解析与初始化 功能&#xff1a;解析命令行参数&#xff0c;设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能&#xff1a;初始化日志记录器&#xff0c;配置监控系统项目经理使用监控和记录工具&#xff0c;实时跟踪施工进度和质量…

【Vim Masterclass 笔记02】第3章:Vim 核心知识 + L08:Vim 核心浏览命令 + L09:Vim 核心浏览命令同步练习

文章目录 Section 3&#xff1a;Vim Essentials&#xff08;Vim 核心知识&#xff09;S03L08 Essential Navigation Commands1 光标的上下左右移动2 上 / 下翻页3 基于单词前移4 基于单词后移5 重新定位视图中的文本&#xff08;页面重绘&#xff09;6 定位到所在行的行首7 光标…

音视频入门基础:MPEG2-PS专题(1)——MPEG2-PS官方文档下载

一、引言 MPEG2-PS&#xff08;又称PS&#xff0c;Program Stream&#xff0c;程序流&#xff0c;节目流&#xff09;是一种多路复用数字音频、视频等的封装容器。MPEG2-PS将一个或多个分组但有共同的时间基准的基本数据流 &#xff08;PES&#xff09;合并成一个整体流。它是…

【Rust自学】8.3. String类型 Pt.1:字符串的创建、更新与拼接

8.3.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构&#xff0c;这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的&#xff0c;这也意味着这些集合的数据大小无需在编…

基础数据结构--二叉树

一、二叉树的定义 二叉树是 n( n > 0 ) 个结点组成的有限集合&#xff0c;这个集合要么是空集&#xff08;当 n 等于 0 时&#xff09;&#xff0c;要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。 如图所示&am…

力扣-数据结构-7【算法学习day.78】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

C++ —— 模板类扩展

C —— 模板类扩展 模板类的成员模板将模板类用作参数 模板类的成员模板 结构体中可以有结构体&#xff0c;类中可以有类和成员函数。那么&#xff0c;模板类中也应该可以有模板类和模板函数。 在类AA中再创建一个模板类和模板函数。 先创建模板类&#xff0c;代码如下&#x…

Flink中并行度和slot的关系——任务和任务槽

一、任务槽&#xff08;task slots) Flink的每一个TaskManager是一个JVM进程&#xff0c;在其上可以运行多个线程&#xff08;任务task&#xff09;&#xff0c;那么每个线程可以拥有多少进程资源呢&#xff1f;任务槽就是这样一个概念&#xff0c;对taskManager上每个任务运行…

Android着色器SweepGradient渐变圆环,Kotlin

Android着色器SweepGradient渐变圆环&#xff0c;Kotlin import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.SweepGradient import android…

QT---------GUI程序设计基础

代码UI化设计&#xff08;QT&#xff09; 实例功能概述 假设我们要创建一个简单的计算器应用程序。该应用程序具有以下功能&#xff1a; 包含数字按钮&#xff08;0-9&#xff09;、操作符按钮&#xff08;、-、*、/&#xff09;、等于按钮&#xff08;&#xff09;和清除按…

torch.nn.functional的用法

文章目录 介绍激活函数示例 损失函数示例 卷积操作示例 池化示例 归一化操作示例 Dropout示例 torch.nn.functional 与 torch.nn 的区别 介绍 torch.nn.functional 是 PyTorch 中的一个模块&#xff0c;提供了许多函数式的神经网络操作&#xff0c;包括激活函数、损失函数、卷…

关于Nginx

1.Nginx的配置 proxy_pass http: 当你需要将请求分发到多个后端服务器时&#xff0c;需要实现负载均衡功能&#xff0c;可以使用upstream指令定义一组服务器&#xff0c;并在proxy_pass中引用这个服务组名称。。如果不需要负载均衡&#xff0c;只需要将请求转发到单一的后端…

redis用途都有哪些

Redis&#xff0c;作为一个开源的高性能键值对数据库&#xff0c;其用途广泛且功能强大。 1. 缓存&#xff08;Caching&#xff09;&#xff1a; • Redis常被用作缓存层&#xff0c;存储那些频繁访问但不易改变的数据&#xff0c;如用户会话、商品详情等。 • 通过将这些数据存…

YOLOv9-0.1部分代码阅读笔记-train.py

train.py train.py 目录 train.py 1.所需的库和模块 2.def train(hyp, opt, device, callbacks): 3.def parse_opt(knownFalse): 4.def main(opt, callbacksCallbacks()): 5.def run(**kwargs): 6.if __name__ "__main__": 1.所需的库和模块 import …

Gemma2 2B 模型的model.safetensors.index.json文件解析

Gemma2 2B 模型的 model.safetensors.index.json 文件解析 在使用 Gemma2 2B 模型或其他大型预训练模型时&#xff0c;model.safetensors.index.json 文件起到了索引的作用&#xff0c;它帮助我们了解模型的结构、参数存储方式以及如何加载模型的具体权重。本博客将深入解析该…

【每日学点鸿蒙知识】人脸活体检测、NodeController刷新、自动关闭输入框、Row设置中间最大宽、WebView单例

1、HarmonyOS 人脸活体检测调用&#xff1f; H5调用应用侧方法可参考以下demo&#xff1a; index.ets Web()//注册方法.javaScriptProxy({object: this.testObj,name: "testObjName",methodList: ["getLocationTS"],controller: this.webController})cla…

JSON结构快捷转XML结构API集成指南

JSON结构快捷转XML结构API集成指南 引言 在当今的软件开发世界中&#xff0c;数据交换格式的选择对于系统的互操作性和效率至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种广泛使用的数据表…