当前位置: 首页 > news >正文

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.xmlbuild.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.propertiesapplication.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 是一个非常流行的、快速搭建应用的框架&#xff0c;它无需大量的配置即可运行起来&#xff0c;而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势&#xff0c;可以为应用提供强大的文件存储功能。 为什么选择七牛云OSS? 七牛云OSS提供了高速的…...

C++:二叉搜索树模拟实现(KV模型)

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

npm淘宝镜像源换新地址

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

十大排序算法之线性时间非比较类排序

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

容器基础:Docker 镜像如何保证部署的一致性?

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

爪哇部落算法组2024新生赛热身赛题解

第一题&#xff08;签到&#xff09;&#xff1a; 1、题意&#xff1a; 2、题解: 我们观察到happynewyear的长度是12个字符&#xff0c;我们直接从前往后遍历0到n - 12的位置&#xff08;这里索引从0开始&#xff09;&#xff0c;使用C的substr()函数找到以i开头的长度为12的字…...

1123. 铲雪车(欧拉回路)

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

网络协议与攻击模拟_15FTP协议

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

「效果图渲染」效果图与3D影视动画渲染平台

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

Blender_查看版本

Blender_查看版本 烦人的烦恼&#xff0c;没找见哪儿可以查看版本&#xff1f; 算是个隐蔽的角落&#xff01;...

node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件

请参阅&#xff1a;java : pdfbox 读取 PDF文件内书签 请注意&#xff1a;书的目录.txt 编码&#xff1a;UTF-8&#xff0c;推荐用 Notepad 转换编码。 npm install elementtree ; npm install xml2js ; node.js 用 elementtree读目录.txt文件&#xff0c;用 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 导出…...

了解海外云手机的多种功能

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

白酒:自动化生产线的优势与实践

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

用HTML5实现灯笼效果

本文介绍了两种实现效果&#xff1a;一种使用画布&#xff08;canvas&#xff09;标签/元素&#xff0c;另一种不用画布&#xff08;canvas&#xff09;标签/元素主要使用CSS实现。 使用画布&#xff08;canvas&#xff09;标签/元素实现&#xff0c;下面&#xff0c;在画布上…...

Postgresql源码(120)事务XID分配与主备XID同步

参考 《Postgresql源码&#xff08;25&#xff09;子事务可见性判断和性能问题》 XID获取顶层入口 函数&#xff1a;AssignTransactionId static void AssignTransactionId(TransactionState s) {...优先给没有事务ID的父事务分配 确保父事务有 XID&#xff0c;以便子事务总是…...

B2077 角谷猜想(洛谷)

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

排序算法---归并排序

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

[WUSTCTF2020]朴实无华(特详解)

一开始说header出问题了 就先dirsaerch扫一遍 发现robot.txt 访问一下 去看看&#xff0c;好好好&#xff0c;肯定不是得 他一开始说header有问题&#xff0c;不妨抓包看看&#xff0c;果然有东西 访问看看&#xff0c;乱码修复一下&#xff0c;在之前的博客到过 <img src…...

下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置

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

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...