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、设置私有空间等措施来保护数据安全。同时,还可以根据需要添加更多复杂的特性,比如文件类型检查、大文件断点续传、图片处理服务等。


感谢你的阅读,希望本文对你有所帮助。如果你有任何问题或建议,欢迎留言。

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

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

相关文章

电商小程序05用户注册

目录 1 搭建页面2 设置默认跳转总结 我们上一篇拆解了登录功能&#xff0c;如果用户没有账号就需要注册了。本篇我们介绍一下注册功能的实现。 1 搭建页面 打开应用&#xff0c;点击左上角的新建页面 输入页面的名称&#xff0c;用户注册 删掉网格布局&#xff0c;添加表单容…

maven-install-plugin:2.4:install (default-cli) on project ability-dispatch:

IDEA&#xff0c;instal时报错 &#xff0c;错误 信息如下&#xff1a; Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-cli) on project ability-dispatch: The packaging for this project did not assign a file to the buil…

Unity3d Shader篇(六)— BlinnPhong高光反射着色器

文章目录 前言一、BlinnPhong高光反射着色器是什么&#xff1f;1. BlinnPhong高光反射着色器的工作原理2. BlinnPhong高光反射着色器的优缺点优点缺点 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三…

K8S之标签的介绍和使用

标签 标签定义标签实操1、对Node节点打标签2、对Pod资源打标签查看资源标签删除资源标签 标签定义 标签就是一对 key/value &#xff0c;被关联到对象上。 标签的使用让我们能够表示出对象的特点&#xff0c;比如使用在Pod上&#xff0c;能一眼看出这个Pod是干什么的。也可以用…

加固平板电脑丨三防智能平板丨工业加固平板丨智能城市管理

随着智能城市的不断发展&#xff0c;人们对于城市管理的要求也在不断提高&#xff0c;这就需要高效、智能的城市管理平台来实现。而三防平板就是一款可以满足这一需求的智能设备。 三防平板是一种集防水、防尘、防摔于一体的智能平板电脑&#xff0c;它可以在复杂的环境下稳定运…

【十二】【C++】vector用法的探究

vector类创建对象 /*vector类创建对象*/ #if 1 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std; #include <vector> #include <algorithm> #include <crtdbg.h>class Date {public:Date(int year 1900, int month 1, int …

自适应二次元404页面源码

自适应二次元404页面源码&#xff0c;HTMLCSSJS,喜欢二次元的朋友可以下载使用 蓝奏云&#xff1a;https://wfr.lanzout.com/iuPNQ1ns7dxg

js中new操作符详解

文章目录 一、是什么二、流程三、手写new操作符 一、是什么 在JavaScript中&#xff0c;new操作符用于创建一个给定构造函数的实例对象 例子 function Person(name, age){this.name name;this.age age; } Person.prototype.sayName function () {console.log(this.name) …

STM32控制JQ8400语音播报模块

时间记录&#xff1a;2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚&#xff0c;正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚&#xff0c;3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…

华为第二批难题一:基于预训练AI模型的元件库生成

我的理解&#xff1a;华为的这个难道应该是想通过大模型技术&#xff0c;识别元件手册上的图文内容&#xff0c;与现有建库工具结合&#xff0c;有潜力按标准生成各种库模型。 正好&#xff0c;我们正在研究&#xff0c;利用知识图谱技术快速生成装配模型&#xff0c;其中也涉…

内网渗透靶场02----Weblogic反序列化+域渗透

网络拓扑&#xff1a; 攻击机&#xff1a; Kali: 192.168.111.129 Win10: 192.168.111.128 靶场基本配置&#xff1a;web服务器双网卡机器&#xff1a; 192.168.111.80&#xff08;模拟外网&#xff09;10.10.10.80&#xff08;模拟内网&#xff09;域成员机器 WIN7PC192.168.…

【CV论文精读】EarlyBird: Early-Fusion for Multi-View Tracking in the Bird’s Eye View

【CV论文精读】EarlyBird: Early-Fusion for Multi-View Tracking in the Bird’s Eye View 0.论文摘要 多视图聚合有望克服多目标检测和跟踪中的遮挡和漏检挑战。多视图检测和3D对象检测中的最新方法通过将所有视图投影到地平面并在鸟瞰视图&#xff08;BEV&#xff09;中执…