Java21 + SpringBoot3集成七牛云对象存储OSS,实现文件上传

文章目录

    • 前言
    • 实现步骤
      • 引入maven依赖
      • 修改配置文件
      • 创建七牛云配置类
      • 创建文件操作服务类
      • 创建文件操作控制器
      • 前端实现
      • 运行效果
    • 总结

前言

近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。本项目为前后端分离开发,后端基于Java21SpringBoot3开发,后端使用Spring SecurityJWTSpring Data JPA等技术栈,前端提供了vueangularreactuniapp微信小程序等多种脚手架工程。

项目地址: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;}@Overridepublic String upload(MultipartFile file) throws IOException {if (file.isEmpty()) {throw new RuntimeException("文件是空的");}// 创建上传tokenAuth 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);// 返回文件urlreturn 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-requeston-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>

运行效果

image.png

总结

本文主要介绍如何在SpringBoot中集成七牛云OSS,并结合前端使用Element Plus库的Upload组件实现文件上传功能。如有错误,还望批评指正。

在后续实践中我也是及时更新自己的学习心得和经验总结,希望与诸位看官一起进步。

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

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

相关文章

apipost 简单的性能压测总结

1、简单的使用机型牌评估 1&#xff09;jdk默认256M给100用&#xff0c;推荐给1000人同时用JVM 堆栈建议2G~4G&#xff08;目前定了机型4核8G内存 2T磁盘做radio0存储&#xff09;&#xff1b; 2&#xff09;数据库配置文件写了占了2G内存&#xff08;my.cnf文件&#xff09…

计算机网络-封装成帧透明传输(组帧方法)

文章目录 数据链路层功能概述封装成帧透明传输组帧方法字符计数法字符填充法零比特填充法违规编码法 字符填充法为啥复杂和不兼容 数据链路层功能概述 类似老板让小秘书送文件给别的公司&#xff0c;小秘书告诉傻子怎么把该文件送到别的公司的小秘书&#xff0c;然后别的公司的…

em/px/rem/vh/vw的区别

文章目录 一、介绍二、单位pxemremvh、vw 三、总结 一、介绍 传统的项目开发中&#xff0c;我们只会用到px、%、em这几个单位&#xff0c;它可以适用于大部分的项目开发&#xff0c;且拥有比较良好的兼容性 从CSS3开始&#xff0c;浏览器对计量单位的支持又提升到了另外一个境…

寒假 day3

1.请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 2.请编程实现双向链表按任意位置插入、删除、修改、查找 //头文件 #ifndef __HEAD_H__ #define __HEAD_H__ #include<stdio.h> #include<string.h> #include<stdlib.h> typedef char datatype;//…

3. 状态管理 vuex 状态管理库

目录 3.1 vuex 介绍 3.2 使用方式 3.1 vuex 介绍 vuex 是一个专为 Vue.js 应用程序开发的状态管理库 vuex 可以在多个组件之间共享数据&#xff0c;并且共享的数据是响应式的&#xff0c;即数据的变更能及时渲染到模板 vuex 采用集中式存储管理所有组件的状态 每一个 Vuex…

使用ESP32-S3对MQ-135空气质量传感器的使用记录(Arduino版)

一、硬件上&#xff1a; 1、使用esp32开发板的04引脚与AO连接&#xff0c;检测AO引脚的电平 二、软件上&#xff1a; 1、使用Arduino快速完成开发 2、源码&#xff1a; // Potentiometer is connected to GPIO 04 (Analog ADC1_CH3) const int adcPin 4;// variable for s…

2023启示录丨中国ESG这一年:在矛盾与摸索中前行

图片&#xff5c;Photo by Colby Winfield on Unsplash ©自象限原创 作者丨罗辑 编辑丨程心 2023年&#xff0c;许多行业开始争抢ESG人才&#xff0c;在猎聘APP上搜索“ESG”&#xff0c;相关岗位月薪可以达到10W~13W&#xff0c;甚至一些行业应届生的起薪都达到2~4万。…

少儿编程 中国电子学会图形化编程2022年1月等级考试Scratch三级真题解析(选择题、判断题)

1.默认小猫角色和气球角色都是显示状态&#xff0c;小猫程序如下图所示&#xff0c;气球没有程序&#xff0c;点击绿旗&#xff0c;舞台上最终显示的效果是&#xff1f;&#xff08; &#xff09; A&#xff1a;可能出现6个不同位置的小猫和6个小球 B&#xff1a;可能出现6个…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(二)

在上一篇文章中&#xff0c;我们成功验证了Intel Threading Building Blocks (TBB) 与 OpenMP 在多线程并行处理方面的加速潜力。为了更深入地理解这些技术在实际应用场景中的效能提升&#xff0c;接下来我们将目光转向目标开发板环境&#xff0c;进一步探究这两种框架在嵌入式…

《幻兽帕鲁》好玩吗?幻兽帕鲁能在Mac上运行吗?

最近一款叫做《幻兽帕鲁》的新游戏走红&#xff0c;成为了Steam游戏平台上&#xff0c;连续3周的销量冠军&#xff0c;有不少Mac电脑用户&#xff0c;利用Crossover成功玩上了《幻兽帕鲁》&#xff0c;其实Crossover已经支持很多3A游戏&#xff0c;包括《赛博朋克2077》《博德之…

外卖单店小程序模板/小程序前端模板

外卖单店小程序模板简介&#xff1a;外卖单店小程序前端模板 外卖单店小程序模板截图

Java语法学习坐标体系/绘图

Java语法学习坐标体系/绘图 大纲 基本介绍绘图 具体案例 1. 基本介绍 2.绘图 基本介绍&#xff1a; 注意每次自动调用&#xff0c;就会重新执行一次paint方法里的所有程序 先自定义面板 创建一个类继承JPanel&#xff0c;然后重写构造器&#xff0c;paint方法 class M…