Java21 + SpringBoot3集成七牛云对象存储OSS,实现文件上传
前言
近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。本项目为前后端分离开发,后端基于Java21和SpringBoot3开发,后端使用Spring Security、JWT、Spring Data JPA等技术栈,前端提供了vue、angular、react、uniapp、微信小程序等多种脚手架工程。
项目地址:https://gitee.com/breezefaith/fast-alden
项目中使用七牛云对象存储Kodo作为云端文件存储中心,本文主要介绍如何在SpringBoot中集成七牛云OSS,并结合前端使用Element Plus库的Upload组件实现文件上传功能。
实现步骤
引入maven依赖
在pom.xml中引入七牛云及其相关依赖,本文还引入了lombok用于简化代码。
<dependencies>
<!-- 七牛云SDK -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.13.0, 7.13.99]</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<optional>true</optional>
</dependency>
</dependencies>
修改配置文件
在application.yml中可以自定义七牛云相关配置信息。
fast-alden:
file:
oss:
qiniu:
access-key: *** # 请从七牛云工作台-个人中心-密钥管理获取
secret-key: *** # 请从七牛云工作台-个人中心-密钥管理获取
bucket: demo # 七牛云存储空间名称
directory: upload/ # 自定义存储空间内目录
domain: https://qiniu.demo.com/ # 存储空间自定义域名,请提前在存储空间中进行配置
创建七牛云配置类
/**
* 七牛云OSS相关配置
*/
@Configuration
@ConfigurationProperties(prefix = "fast-alden.file.oss.qiniu")
@Getter
@Setter
public class QiniuConfig {
/**
* AC
*/
private String accessKey;
/**
* SC
*/
private String secretKey;
/**
* 存储空间
*/
private String bucket;
/**
* 上传目录
*/
private String directory;
/**
* 访问域名
*/
private String domain;
}
创建文件操作服务类
创建文件操作服务类接口。
/**
* 文件操作服务
*/
public interface FileService {
/**
* 文件上传
*
* @param file 待上传的文件
* @return 访问该文件的url
* @throws IOException
*/
String upload(MultipartFile file) throws IOException;
}
创建文件操作服务实现类,基于七牛云SDK实现。
/**
* 七牛云对象存储文件服务
*/
@Service("fileService")
public class QiniuFileServiceImpl implements FileService {
private final QiniuConfig qiniuConfig;
public QiniuFileServiceImpl(QiniuConfig qiniuConfig) {
this.qiniuConfig = qiniuConfig;
}
@Override
public String upload(MultipartFile file) throws IOException {
if (file.isEmpty()) {
throw new RuntimeException("文件是空的");
}
// 创建上传token
Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
String upToken = auth.uploadToken(qiniuConfig.getBucket());
// 设置上传配置,Region要与存储空间所属的存储区域保持一致
Configuration cfg = new Configuration(Region.huadongZheJiang2());
// 创建上传管理器
UploadManager uploadManager = new UploadManager(cfg);
String originalFilename = file.getOriginalFilename();
// 构造文件目录和文件名
assert originalFilename != null;
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileKey = qiniuConfig.getDirectory() + UUID.randomUUID() + suffix;
// 上传文件
Response response = uploadManager.put(file.getInputStream(), fileKey, upToken, null, null);
// 返回文件url
return qiniuConfig.getDomain() + fileKey;
}
}
上述代码中有一行用到了
Region.huadongZheJiang2(),此处要与自己的存储空间所属的存储区域保持一致,本文中所使用的存储空间属于华东-浙江2区域。
创建文件操作控制器
@RestController
@RequestMapping("/file")
public class FileController {
private final FileService fileService;
public FileController(FileService fileService) {
this.fileService = fileService;
}
@PostMapping("/upload")
public String upload(MultipartFile multipartFile) throws IOException {
return fileService.upload(multipartFile);
}
}
前端实现
本工程前端基于Vue3组合式API开发,使用Element Plus作为UI库,借助Upload组件实现文件上传,本文在使用Upload组件时并没有直接使用其action属性,而是通过http-request和on-success属性实现了自定义的文件上传过程。
<script setup>
import axios from "axios";
import { ElButton, ElMessage } from "element-plus";
const uploadFile = async (options) => {
const formData = new FormData();
formData.append("file", options.file);
return axios.post(`/file/upload`, formData);
};
const onUploadFileSuccess = async () => {
ElMessage({
message: "上传成功", type: "success"
});
}
</script>
<template>
<ElForm>
<ElFormItem>
<ElUpload action="" :http-request="uploadFile" :on-success="onUploadFileSuccess">
<ElButton type="primary">点击上传文件</ElButton>
</ElUpload>
</ElFormItem>
</ElForm>
</template>
运行效果

总结
本文主要介绍如何在SpringBoot中集成七牛云OSS,并结合前端使用Element Plus库的Upload组件实现文件上传功能。如有错误,还望批评指正。
在后续实践中我也是及时更新自己的学习心得和经验总结,希望与诸位看官一起进步。
Java21 + SpringBoot3集成七牛云对象存储OSS,实现文件上传的更多相关文章
- django之集成七牛云对象存储
Python3 + Django2.0 集成 "七牛云" 对象存储 (SDK文档地址:http://developer.qiniu.com/kodo/api/3928/error- ...
- Delphi阿里云对象存储OSS【支持上传文件、下载文件、删除文件、创建目录、删除目录、Bucket操作等】
作者QQ:(648437169) 点击下载➨Delphi阿里云对象存储OSS 阿里云api文档 [Delphi阿里云对象存储OSS]支持 获取Bucket列表.设置Bucket ...
- DT添加七牛云对象存储插件功能
七牛云对象存储 1.注意客户购买的空间的存储区域,区域不同对应的上传域名不同 destoon 七牛云上传文件 用下面源码替换include/ftp.class.php 文件代码 &l ...
- 使用FileZilla Pro S3协议访问七牛云对象存储
偶然发现FileZilla还有Pro版本,主要是比免费版多了一些协议支持,也偶然发现七牛云支持了S3协议接口,这样刚好弥补了其没有FTP的不足,于是找官方文档,折腾一下,使用FileZilla Pro ...
- Gin + 七牛云对象存储
配置七牛云存储 创建存储空间 拿到密钥 安装七牛云对象存储SDK 推荐go.mod安装 // 将下面地址复制到go.mod,然后执行go mod download github.com/qiniu/a ...
- springboot整合OSS实现文件上传
OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.OSS可用于图片.音视频.日志等海量文件的存储.各种终端 ...
- JAVA整合阿里云OSS实现文件上传功能
引入maven <dependency> <groupId>org.apache.commons</groupId> <artifactId>commo ...
- 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载
这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...
- 基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)
一个极简的Web图床应用,支持复制粘贴与拖拽上传图片 1.开发缘由 日常使用Vs Code编写markdown笔记与博客文章时,在文章中插入图片时发现非常不便 使用本地文件编写相对路径---没法直接复 ...
- 阿里云对象存储OSS与文件存储NAS的区别
一.简介 应用场景:选择一款存储产品,面向文档数据的存取,不会涉及到数据处理. 产品选型主要从OSS和NAS中选择一款,满足文档存储的需求. 二.NAS优缺点 NAS 是一种采用直接与网络介质相连的特 ...
随机推荐
- Android 原生 SQLite 数据库的一次封装实践
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/CL4MsQEsrWS8n7lhXCOQ_g作者:Li Bingyan 本文主要讲述原生SQLi ...
- 制作PE工具箱
事前准备: 能上网的电脑 x1 台 大于8G的U盘 x一个(如果需要储存安装镜像的话,如果不需要的话大于1G即可) 一.下载PE工具箱 推荐使用WEPE工具箱,无广告无推广.不推荐老X桃,大X菜,大X ...
- 用ArcGIS模型构建器生成、导出Python转换空间坐标系的代码
本文介绍在ArcMap软件中,通过创建模型构建器(ModelBuilder),导出地理坐标系与投影坐标系之间相互转换的Python代码的方法. 在GIS领域中,矢量.栅格图层的投影转换是一个经 ...
- 智慧城市大数据运营中心 IOC 之 Web GIS 地图应用
前言 IOC(Intelligent Operations Center)--智慧城市智能运营中心就是智慧城市的大脑,是建立在各个智慧应用系统之上的系统.通过对政府各职能部门的业务信息共享与整合,聚焦 ...
- SpringMVC的特性及应用
Spring MVC特点 清晰地角色划分 灵活的配置功能 提供了大量的控制器接口和实现类 真正的View层实现无关(JSP.Velocity.Xslt等) 国际化支持 面向接口编程 Spring提供了 ...
- yakit的web fuzzer功能的使用
问题 yakit没有Burp 的 Intruder 爆破模块,那么yakit该怎么进行参数爆破?yakit参数爆破的方式与burp有什么区别? 前言 手工测试场景中需要渗透人员对报文进行反复的发送畸形 ...
- Java中内存四区
这里简要说明这四个区域通常用于存储的变量类型: 栈区(Stack): 存放局部变量.方法参数.返回地址等. 变量的生命周期与其所在的方法(函数)的调用周期一致. 堆区(Heap): 主要用于动态分配内 ...
- 第二章 VB.NET 绘图基础
GDI+( Graphics Device Interface Plus)是 Windows操作系统用来执行绘画及其他相关图形操作的一套子系统,是由. Net Framework中的System.Dr ...
- [转帖]Java 8 要过时了?从JDK8飞升到JDK17,一次性给你讲明白
https://blog.csdn.net/agonie201218/article/details/127916729?spm=1001.2101.3001.6650.2&utm_mediu ...
- [转帖]3.3.8. KWR运行期对比报告 KWR DIFF
https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys- ...