Spring Boot + 七牛OSS: 简化云存储集成
引言
Spring Boot 是一个非常流行的、快速搭建应用的框架,它无需大量的配置即可运行起来,而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势,可以为应用提供强大的文件存储功能。
为什么选择七牛云OSS?
- 七牛云OSS提供了高速的文件传输服务。
- 它有完备的安全机制,保障你的数据安全。
- 提供了良好的API支持,让开发者可以方便的集成到自己的应用中。
准备工作
在开始之前,你需要准备以下内容:
-
JDK 1.8 或更高版本。
-
Maven 或 Gradle,用于构建项目。
-
一个可用的七牛云账号,以及创建一个对象存储空间(bucket)。 七牛云10G免费永久对象存储服务申请全攻略
-
获取你的七牛云存储的访问密钥(Access Key)和秘密密钥(Secret Key)。
个人中心
创建Spring Boot项目
使用Spring Initializr(https://start.spring.io/)生成一个基本的Spring Boot项目骨架,选择你需要的Spring Boot版本, 并添加Web依赖。
集成七牛云依赖
在项目的pom.xml
或build.gradle
文件中添加七牛云Java SDK的依赖:
<!-- Maven例子 -->
<dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.x.x</version>
</dependency>
或者
// Gradle例子
implementation 'com.qiniu:qiniu-java-sdk:7.x.x'
确保将7.x.x
替换为最新的SDK版本号。
配置文件设置
在application.properties
或application.yml
中添加七牛云相关的配置项:
# application.properties
qiniu.accessKey=你的AccessKey
qiniu.secretKey=你的SecretKey
qiniu.bucket=你的存储空间名
qiniu.domain=你的域名
七牛云工具类编写
工具类
机房 | Region |
---|---|
华东 | Region.redion(),Region .huadong() |
华南 | Region .redion2(),Region .huanan() |
华北 | Region .region1(),Region .huabei() |
北美 | Region .regionNa0(),Region .beimei() |
东南亚 | Region .regionAs0(),Region.xinjiapo() |
创建一个工具类,名为QiniuUtil
,用于处理文件的上传等操作:
@Component
public class QiniuUtil {/*** 构造一个带指定 Region 对象的配置类,因为我的是华南机房,所以为Region.region2()*/Configuration cfg = new Configuration(Region.region2());@Value("${qiniu.accessKey}")String accessKey;@Value("${qiniu.secretKey}")String secretKey;@Value("${qiniu.bucket}")String bucket;@Value("${qiniu.domain}")String domain;/*** 文件名前缀*/String prefix = "";/*** 每次迭代的长度限制,最大1000,推荐值 1000*/int limit = 1000;/*** 指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串*/String delimiter = "";/*** 列举空间文件列表*/public List<String> listSpaceFiles() {List<String> list = new ArrayList<>();Auth auth = Auth.create(accessKey, secretKey);BucketManager bucketManager = new BucketManager(auth, cfg);BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit, delimiter);while (fileListIterator.hasNext()) {//处理获取的file list结果FileInfo[] items = fileListIterator.next();for (FileInfo item : items) {System.out.println(item.key);System.out.println(item.fsize / 1024 + "kb");System.out.println(item.mimeType);list.add(item.key);}}return list;}/*** 上传本地文件*/public String upload(String localFilePath) {UploadManager uploadManager = new UploadManager(cfg);/*** 如果是Windows情况下,格式是 D:\\qiniu\\test.png* 以文件最低级目录名作为文件名*/String[] strings = localFilePath.split("\\\\");String key = strings[strings.length - 1];Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(localFilePath, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);return putRet.key;} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}return null;}}/*** 获取下载文件的链接** @param fileName 文件名称* @return 下载文件的链接*/public String getFileUrl(String fileName) throws UnsupportedEncodingException {String encodedFileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20");String finalUrl = String.format("%s/%s", "http://" + domain, encodedFileName);System.out.println(finalUrl);return finalUrl;}/*** 批量删除空间中的文件** @param fileList 文件名称列表*/public String deleteFile(String[] fileList) {Auth auth = Auth.create(accessKey, secretKey);BucketManager bucketManager = new BucketManager( auth, cfg);try {//单次批量请求的文件数量不得超过1000BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();batchOperations.addDeleteOp(bucket, fileList);Response response = bucketManager.batch(batchOperations);BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);for (int i = 0; i < fileList.length; i++) {BatchStatus status = batchStatusList[i];String key = fileList[i];System.out.print(key + "\t");if (status.code == 200) {System.out.println("删除成功");return "删除成功";} else {System.out.println(status.data.error);return "删除失败";}}} catch (QiniuException ex) {System.err.println(ex.response.toString());}return null;}
}
七牛云控制类编写
创建一个控制类,名为QiniuController
,用于处理请求路径等操作:
@RestController
@RequestMapping("/qiniu")
public class QiniuController {@ResourceQiniuUtil qiniuUtil;@RequestMapping("/upload")public String upload(String localFilePath) {return qiniuUtil.upload(localFilePath);}@RequestMapping("/listSpaceFiles")public List<String> listSpaceFiles() {return qiniuUtil.listSpaceFiles();}@RequestMapping("/getFileUrl")public String getFileUrl(String fileName) {try {return qiniuUtil.getFileUrl(fileName);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;}@RequestMapping("/deleteFile")public String deleteFile(String[] fileList) {return qiniuUtil.deleteFile(fileList);}
}
PostMan测试
测试来确保我们的服务可以正确运行。
上传文件
查看上传文件列表
根据名称获取下载链接
浏览器访问测试
批量删除空间中的文件
完结
通过集成七牛云对象存储服务,你的Spring Boot应用将获得一个可靠和可扩展的文件存储方案。使用七牛云提供的服务降低了应用的维护成本,并提高了文件处理的效率。
这篇博文仅仅是一个入门指南。在实际的应用中,你还需要注意更多的安全性问题,如使用HTTPS、设置私有空间等措施来保护数据安全。同时,还可以根据需要添加更多复杂的特性,比如文件类型检查、大文件断点续传、图片处理服务等。
感谢你的阅读,希望本文对你有所帮助。如果你有任何问题或建议,欢迎留言。
相关文章:

Spring Boot + 七牛OSS: 简化云存储集成
引言 Spring Boot 是一个非常流行的、快速搭建应用的框架,它无需大量的配置即可运行起来,而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势,可以为应用提供强大的文件存储功能。 为什么选择七牛云OSS? 七牛云OSS提供了高速的…...

C++:二叉搜索树模拟实现(KV模型)
C:二叉搜索树模拟实现(KV模型) 前言模拟实现KV模型1. 节点封装2、前置工作(默认构造、拷贝构造、赋值重载、析构函数等)2. 数据插入(递归和非递归版本)3、数据删除(递归和非递归版本…...

npm淘宝镜像源换新地址
新的淘宝npm镜像源地址:https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的,则直接安装 npm install -g cnpm --regi…...

十大排序算法之线性时间非比较类排序
线性时间非比较类排序 线性时间的算法执行效率也较高,从时间占用上看,线性时间非比较类排序要优于非线性时间排序,但其空间复杂度较非线性时间排序要大一些。因为线性时间非比较类排序算法会额外申请一定的空间进行分配排序,这也…...

容器基础:Docker 镜像如何保证部署的一致性?
Docker 镜像如何通过固化基础环境、固化依赖性和固化软件启动流程保证部署的一致性 Docker 镜像通过以下三个方面保证部署的一致性: 1. 固化基础环境: 镜像包含构建应用程序所需的所有环境依赖项,例如操作系统、库和工具。构建镜像时,所有…...

爪哇部落算法组2024新生赛热身赛题解
第一题(签到): 1、题意: 2、题解: 我们观察到happynewyear的长度是12个字符,我们直接从前往后遍历0到n - 12的位置(这里索引从0开始),使用C的substr()函数找到以i开头的长度为12的字…...

1123. 铲雪车(欧拉回路)
活动 - AcWing 随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。 整个城市所有的道路都是双向车道,道路的两个方向均需要铲雪。因为城市预算的削减,整个城市只有 1 辆铲雪车。 铲雪车只能把它开过的地方(车道)的雪铲干…...

网络协议与攻击模拟_15FTP协议
了解FTP协议 在Windows操作系统上使用serv-U软件搭建FTP服务 分析FTP流量 一、FTP协议 1、FTP概念 FTP(文件传输协议)由两部分组成:客户端/服务端(C/S架构) 应用场景:企业内部存放公司文件、开发网站时利…...

「效果图渲染」效果图与3D影视动画渲染平台
效果图渲染和3D影视动画渲染都是视觉图像渲染的领域应用。效果图渲染主要服务于建筑、室内设计和产品设计等行业,这些领域通常对视觉呈现的精度和细节有较高要求。与之相比,3D影视动画渲染则普遍应用于电影、电视、视频游戏和广告等媒体领域,…...

Blender_查看版本
Blender_查看版本 烦人的烦恼,没找见哪儿可以查看版本? 算是个隐蔽的角落!...

node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件
请参阅:java : pdfbox 读取 PDF文件内书签 请注意:书的目录.txt 编码:UTF-8,推荐用 Notepad 转换编码。 npm install elementtree ; npm install xml2js ; node.js 用 elementtree读目录.txt文件,用 xml2js 转换为…...

【Docker】02 镜像管理
文章目录 一、Images镜像二、管理操作2.1 搜索镜像2.1.1 命令行搜索2.1.2 页面搜索2.1.3 搜索条件 2.2 下载镜像2.3 查看本地镜像2.3.1 docker images2.3.2 --help2.3.3 repository name2.3.4 --filter2.3.5 -q2.3.6 --format 2.4 给镜像打标签2.5 推送镜像2.6 删除镜像2.7 导出…...

了解海外云手机的多种功能
随着社会的高度发展,海外云手机成为商家不可或缺的工具,为企业出海提供了便利的解决方案。然而,谈及海外云手机,很多人仍不了解其强大功能。究竟海外云手机有哪些功能,可以为我们做些什么呢? 由于国内电商竞…...

白酒:自动化生产线的优势与实践
随着科技的进步,自动化生产线在各行各业的应用越来越广泛。云仓酒庄的豪迈白酒在生产过程中,也积极引入自动化生产线,以提升生产效率、品质和安全性。 首先,自动化生产线能够显著提高生产效率。传统的手工生产线在生产过程中容易受…...

用HTML5实现灯笼效果
本文介绍了两种实现效果:一种使用画布(canvas)标签/元素,另一种不用画布(canvas)标签/元素主要使用CSS实现。 使用画布(canvas)标签/元素实现,下面,在画布上…...

Postgresql源码(120)事务XID分配与主备XID同步
参考 《Postgresql源码(25)子事务可见性判断和性能问题》 XID获取顶层入口 函数:AssignTransactionId static void AssignTransactionId(TransactionState s) {...优先给没有事务ID的父事务分配 确保父事务有 XID,以便子事务总是…...

B2077 角谷猜想(洛谷)
题目描述 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 33 加 11,如果是偶数,则除以 22,得到的结果再按照上述规则重复处理,最终总能够得到 11。如,假定初始整数为 55&…...

排序算法---归并排序
原创不易,转载请注明出处。欢迎点赞收藏~ 归并排序是一种常见的排序算法,它采用了分治的思想。它将一个待排序的数组递归地分成两个子数组,分别对两个子数组进行排序,然后将排好序的子数组合并成一个有序数组。 具体的归并排序过…...

[WUSTCTF2020]朴实无华(特详解)
一开始说header出问题了 就先dirsaerch扫一遍 发现robot.txt 访问一下 去看看,好好好,肯定不是得 他一开始说header有问题,不妨抓包看看,果然有东西 访问看看,乱码修复一下,在之前的博客到过 <img src…...

下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置
自己编译 OpenCV 挺麻烦的,配置需要耗费很长时间,编译也需要很长时间,而且无法保证能全部编译通过。利用 OpenCV 官网提供的已编译的 OpenCV 库可以节省很多时间。下面介绍安装配置方法。 1. OpenCV 官网 地址是:https://opencv…...

【Linux系统学习】3.Linux用户和权限
Linux用户和权限 1.认知root用户 1.1 root用户(超级管理员) 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中,拥有最大权限的账户名为:root(超级管理员) 而在前期&#…...

视频美颜SDK开发指南:从入门到精通的技术实践
美颜SDK是一种强大的工具,它不仅仅可以让用户在实时视频中获得光滑的肌肤和自然的妆容,从简单的滤镜到复杂的人脸识别,美颜SDK涵盖了广泛的技术领域。 一、美颜SDK的基本原理 美颜SDK包括图像处理、人脸检测和识别、滤镜应用等方面。掌握这些…...

Electron基本介绍
Electron基本介绍 Electron 官方网站:https://www.electronjs.org/zh/ Electron安装方法:npm install electron -g 全局安装 Electron简介:Electron提供了丰富的本地(操作系统)API,使你能够使用纯JavaScr…...

使用网关过滤器,根据业务规则实现微服务动态路由
文章目录 业务场景拦截器实现Spring Cloud Gateway介绍 业务场景 我们服务使用Spring Cloud微服务架构,使用Spring Cloud Gateway 作为网关,使用 Spring Cloud OpenFeign 作为服务间通信方式作为网关,主要作用是鉴权与路由转发。大多数应用场…...

PKI - 03 密钥管理(如何进行安全的公钥交换)
文章目录 Pre密钥管理面临的挑战安全密钥管理的几种方式手动密钥交换与确认受信任的介绍 Pre PKI - 02 对称与非对称密钥算法 密钥管理面临的挑战 密钥管理面临的挑战主要包括以下几点: 安全的公钥交换:在使用基于非对称密钥算法的服务之前,…...

Bee+SpringBoot稳定的Sharding、Mongodb ORM功能(同步 Maven)
Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee 小巧玲珑!仅 860K, 还不到 1M, 但却是功能强大! V2.2 (2024春节・LTS 版) 1.Javabean 实体支持继承 (配置 bee.osql.openEntityCanExtendtrue) 2. 增强批…...

HarmonyOS SDK 助力新浪新闻打造精致易用的新闻应用
原生智能是HarmonyOS NEXT的核心亮点之一,依托HarmonyOS SDK丰富全面的开放能力,开发者只需通过几行代码,即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一,从有声资讯入手,基于Speech Kit朗读控件上线听…...

IT行业有哪些证书含金量高呢?
目录 引言: 一、 计算机网络类证书 二、 数据库管理类证书 三、 安全与信息技术管理类证书 四、 编程与开发类证书 五、 数据科学与人工智能类证书 六、结论: 悟已往之不谏,知来者犹可追 …...

zlib交叉编译(rv1126)
目录 1.下载 2.解压 3.配置 4.编译 1.下载 1)下载地址 zlib Home Site 2)下载tar.gz版本 下载该版本。 2.解压 1)解压到某个文件夹,新建 install-rv1126文件夹 2)进入源码目录 3.配置 1)导出交叉编…...

数字孪生与智慧园区的融合:打造未来产业生态的新篇章
随着科技的飞速发展,数字孪生和智慧园区已经成为当今社会发展的重要趋势。数字孪生技术为物理世界的对象提供了数字化的复制体,而智慧园区则通过各种信息技术手段实现园区的智能化管理。二者的融合,将为未来产业生态的发展开辟新的篇章。 一…...