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的依赖:

xml 复制代码
<!-- Maven例子 -->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.x.x</version>
</dependency>

或者

groovy 复制代码
// Gradle例子
implementation 'com.qiniu:qiniu-java-sdk:7.x.x'

确保将7.x.x替换为最新的SDK版本号。

配置文件设置

application.propertiesapplication.yml中添加七牛云相关的配置项:

properties 复制代码
# 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,用于处理文件的上传等操作:

java 复制代码
@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 {
            //单次批量请求的文件数量不得超过1000
            BucketManager.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,用于处理请求路径等操作:

java 复制代码
@RestController
@RequestMapping("/qiniu")
public class QiniuController {

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


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

相关推荐
腾渊信息科技公司36 分钟前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地2 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
IT_陈寒2 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学2 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈3 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端
Conan在掘金3 小时前
鸿蒙报错速查:arkts-strict-typing Property does not exist on type 'object',object 装函数就炸,根因 + 真解法
后端
颜酱3 小时前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
程序员cxuan4 小时前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
莫逸风4 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_4 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法