【Java】Ruoyi-Vue-Plus 整合 文件分片上传至 minio、阿里云、七牛云等OSS-【后端篇】

开发环境

  • Ruoyi-Vue-Plus 5.1.2(Spring Boot 3.1.7)
  • MySQL 8.0.32
  • minio
  • open JDK 17

common-oss 模块添加相关封装类

entity

ChunkFileInfoBO

package org.dromara.common.oss.chunkfile.entity;import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** 分片文件信息** @since 2024/2/6 10:24*/
@Data
@NoArgsConstructor
public class ChunkFileInfoBO implements Serializable {/*** 文件内容 唯一标识 md5 (文件分片、总文件整体)*/@NotEmpty(message = "文件内容唯一标识 不能为空")private String identifier;/*** 文件名称*/@NotEmpty(message = "文件名称 不能为空")private String filename;/*** 分块大小 根据 totalSize 和这个值可以计算出总共的块数。*/private Long chunkSize;/*** 文件总大小*/private Long totalSize;/*** 总块数*/@NotNull(message = "文件分片总块数 不能为空")private Integer totalChunks;/*** 分块编号 从1开始,注意不是从 0 开始的*/@NotNull(message = "当前文件分片编号 不能为空")private Integer chunkNumber;/*** 当前分块大小*/@NotNull(message = "当前文件分片大小 不能为空")private Long currentChunkSize;/*** 文件前端上传请求唯一标识*/@NotEmpty(message = "文件上传请求唯一标识 不能为空")private String requestId;/*** 文件后端上传请求唯一标识*/private String uploadId;/*** 文件类型后缀*/private String suffix;/*** 文件原始名称*/private String newFilename;/*** 相对路径*/private String relativePath;}

FileMergeBO

package org.dromara.common.oss.chunkfile.entity;import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** 分片合并上传参数** @since 2024/2/6 14:24*/
@Data
@NoArgsConstructor
public class FileMergeBO implements Serializable {/*** 文件名称*/@NotEmpty(message = "文件名称 不能为空")private String filename;/*** 文件内容唯一标识*/@NotEmpty(message = "文件内容唯一标识 不能为空")private String identifier;/*** 文件前端上传请求唯一标识*/@NotEmpty(message = "文件上传请求唯一标识 不能为空")private String requestId;/*** 总块数*/@NotNull(message = "文件分片总块数 不能为空")private Integer totalChunks;}

FileUploadResult

package org.dromara.common.oss.chunkfile.entity;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Set;/*** 分片文件上传返回结果** @since 2024/2/6 10:25*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class FileUploadResult {/*** 是否跳过上传 (已经上传过的,跳过)*/private Boolean skipUpload;/****/private Set<String> uploaded;/*** 是否需要合并*/private Boolean needMerge;/*** 当前文件分片编号*/private Integer currentChunkNum;/*** 文件内容 唯一标识 md5 (文件分片、总文件整体)*/private String identifier;/*** 文件名称*/private String fileName;/*** 文件前端上传请求唯一标识*/private String requestId;/*** sys_oss 主键标识*/private Long ossFileId;/*** 文件上传后的url地址*/private String url;}

SysOssRedisDTO

package org.dromara.common.oss.chunkfile.entity;import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** redis缓存存储对象** @since 2024/2/6 14:08*/
@Data
@NoArgsConstructor
public class SysOssRedisDTO implements Serializable {/*** 文件后端上传请求唯一标识*/private String uploadId;/*** 文件上传后的url地址*/private String url;/*** 文件名称*/private String filePathName;/*** 文件内容 唯一标识 md5 (文件分片、总文件整体)*/private String identifier;/*** 服务商*/private String ossService;
}

enum

FileUploadStatus

package org.dromara.common.oss.chunkfile.enumd;import lombok.AllArgsConstructor;
import lombok.Getter;/*** 文件分片 上传状态枚举** @since 2024/2/6 11:05*/
@Getter
@AllArgsConstructor
public enum FileUploadStatus {/*** 上传中*/UPLOADING("0", "上传进行中"),/*** 上传完成*/UPLOADED("1", "上传完成");/*** 状态码*/private final String code;/*** 状态描述*/private final String desc;}

常量

常量类 OssConstant 中添加文件分片上传缓存常量

    /*** 分片文件 块前缀*/String CHUNK_FILE_PART_PREFIX = GlobalConstants.GLOBAL_REDIS_KEY + "chunk_file_part:";/*** 分片文件 信息前缀*/String CHUNK_FILE_INFO_PREFIX = GlobalConstants.GLOBAL_REDIS_KEY + "chunk_file_info:";

OssClient 类改造

改造 OssClient 类,添加文件分片上传合并到oss的相关方法。

package org.dromara.common.oss.core;public class OssClient {
// ------ 扩展方法 ---------public String getPath(String suffix) {return getPath(properties.getPrefix(), suffix);}/*** 获取分片上传的统一id** @param path 完整文件路径*/public String getChunkUploadUnionId(String path, String contentType) {String uploadId = null;try {InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(properties.getBucketName(), path);if (StringUtils.isNotBlank(contentType)) {ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType(contentType);initRequest.setObjectMetadata(metadata);}initRequest.setCannedACL(getAccessPolicy().getAcl());InitiateMultipartUploadResult initResult = client.initiateMultipartUpload(initRequest);uploadId = initResult.getUploadId();} catch (Exception e) {throw new OssException("上传文件失败,请检查配置信息:[" + e.getMessage() + "]");}System.out.println("uploadId-----:" + uploadId);return uploadId;}/*** 分片上传** @param inputStream* @param path        完整文件路径* @param uploadId* @param partSize* @param partNum* @return*/public PartETag chunkUpload(InputStream inputStream, String path,String uploadId, Long partSize, int partNum) {if (!(inputStream instanceof ByteArrayInputStream

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

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

相关文章

Spring6学习技术|IoC+基于xml管理bean

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; IoC 控制反转。是一种设计思想。 1.获取bean对象的方法 通过id&#xff0c;通过class&#xff0c;和双重方式。 ApplicationContext context new Cla…

IDEA打开已有vue项目

在idea中打开已有的vue项目 1. Idea安装Vue.js插件&#xff08;若已安装此步骤可以忽略&#xff09; 在idea中&#xff0c;file–>settings–>plugins&#xff0c;搜索vue&#xff0c;找到Vue.js插件&#xff0c;点击install即可&#xff0c;安装后重启一下idea即可生效…

Unity2023.1.19_ShaderGraph节点说明以及使用技巧

Unity2023.1.19_ShaderGraph节点说明以及使用技巧 目录 Unity2023.1.19_ShaderGraph节点说明以及使用技巧 1. 快捷键CtrlG完成和UE蓝图使用快捷键C一样的蓝图分组注释效果&#xff1a; 2. Tiling And Offset&#xff1a; 3. 以下是两组URP材质渲染的效果对比&#xff1a; 4…

android之Cordova 5.3.1 Android 应用无法上网

我正在尝试在 android 上部署一个非常简单的 cordova 应用程序。它应该启动&#xff0c;然后通过角度 $http 拉入国家列表并显示它们。 由于某些原因它无法访问互联网&#xff0c;为了简化测试&#xff0c;我添加了一个图像标签来显示网络上的图像。图片也不显示。 我也无法连…

ADO.NET+Redis 实现分布式锁实例

使用 ADO.NET 和 Redis 来实现分布式锁是一个常见的做法&#xff0c;但需要注意的是&#xff0c;ADO.NET 本身并不直接支持分布式锁的实现。ADO.NET 主要用于数据库操作&#xff0c;而 Redis 则是一个内存中的数据结构存储系统&#xff0c;它提供了像分布式锁这样的高级功能。 …

Vue 全组件 局部组件

一、组件定义和使用 1、全局组件 定义 <template> <div> <h1>This is a global component</h1> </div> </template> <script lang"ts"> </script> <style></style> 导入 全局组件在main.ts&#xff…

【C语言必刷题】5.判断闰年

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

智慧公厕是什么?智慧公厕对智慧城市的意义

城市的信息化发展需要催化了智慧城市&#xff0c;公共厕所作为城市的重要民生设施&#xff0c;如何实现更高阶的信息化建设&#xff0c;成为一个重要课题。那么&#xff0c;智慧公厕是什么&#xff1f;为什么它对智慧城市的建设如此重要&#xff1f;本文以智慧公厕源头厂家广州…

QT编写工具基本流程(自用)

以后有人让你写工具的时候&#xff0c;可以方便用这个模版及时提高工作效率&#xff0c;可以争取早点下班。包含库目录&#xff0c;头文件目录&#xff0c;输出目录以及翻译和部署&#xff0c;基本上都全了&#xff0c;也可以做收藏用用。 文章目录 1、创建项目Dialog Widget都…

航空领域中气象常识笔记

前言 由于现在我涉及的项目都是跟气象有关&#xff0c;所以我现在要学习和积累一些气象中的名词和常识&#xff0c;以下为在开发航空领域系统过程中我认为重要的一些知识点记录。 名词解释 强对流天气&#xff1a; 在气象学上&#xff0c;强对流天气指的是一种发生与消失突然…

C++函数重载与编译链接

前言 C支持函数重载&#xff0c;C语言不支持函数重载&#xff0c;它们的区别在于编译器对函数编译的实现不一样。 编译链接 要想明白这个问题&#xff0c;我们首先来简单认识一下编译链接。我们平时写的C&#xff0c;C代码都是需要通过编译链接生成可执行文件的。 为什么需要编…

PNPM 批量检查和更新项目依赖

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

LPC/LSP/LSF辨析

我们在阅读语音或者数字信号处理的论文书籍时经常会遇到LPC,LSF和LSP这些和线性预测相关的名词,刚接触时容易一头雾水,今天我们就介绍下它们之间的关系。 LPC/LSP/LSF 线性预测编码(Linear Predictive coding ,LPC),是一种用于语音信号压缩和分析的方法。在LPC模型中,…

18个惊艳的可视化大屏(第三辑),各行业都有。

2023-04-28 22:35贝格前端工场 本次分享第二辑&#xff0c;请大家慢慢欣赏。

Swift基础知识:18.Swift类

在 Swift 中&#xff0c;类&#xff08;Class&#xff09;是一种用来创建具有共同属性和方法的对象的蓝图。与结构体&#xff08;Structures&#xff09;不同&#xff0c;类是引用类型&#xff0c;它在传递和赋值时是共享同一份数据。类具有面向对象编程的特性&#xff0c;包括…

C语言:数组指针 函数指针

C语言&#xff1a;数组指针 & 函数指针 数组指针数组名 数组访问二维数组 函数指针函数指针使用回调函数 typedef关键字 数组指针 数组本质上也是一个变量&#xff0c;那么数组也有自己的地址&#xff0c;指向整个数组的指针&#xff0c;就叫做数组指针。 我先为大家展示…

041-WEB攻防-ASP应用HTTP.SYS短文件文件解析Access注入数据库泄漏

041-WEB攻防-ASP应用&HTTP.SYS&短文件&文件解析&Access注入&数据库泄漏 #知识点&#xff1a; 1、ASP-SQL注入-Access数据库 2、ASP-默认安装-数据库泄漏下载 3、ASP-IIS-CVE&短文件&解析&写入 演示案例&#xff1a; ➢ASP-默认安装-MDB数据库泄…

如何压缩pdf文件大小?3个有效的解决方法分享

如何压缩pdf文件大小&#xff1f;在办公中&#xff0c;PDF文件大小的压缩不仅有助于节省存储空间&#xff0c;使得大量的PDF文件可以更为高效地存储在有限的硬盘或云端空间中&#xff0c;还能显著加快文件在网络中的传输速度&#xff0c;特别是在处理大型或批量PDF文件时&#…

EXCEL使用VBA一键批量转换成PDF

EXCEL使用VBA一键批量转换成PDF 上图是给定转换路径 Sub 按钮1_Click() Dim a(1 To 1000) As String Dim a2 As String Dim myfile As String Dim wb As Workbook a2 Trim(Range("a2"))myfile Dir(a2 & "\" & "*.xls")k 0Do While m…

springcloud-网关(gateway)

springcloud-网关(gateway) 概述 \Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API&#xff0c;并为其提供跨领域的关注&#xff0c;如&#xff1a;安全、监控/指标和容错 常用术语 Route&#xff08;路由&#xff09;: 网关的基本构件。它由一个ID、一个目的地…