如何在 Spring Boot 项目中集成七牛云存储

在本教程中,我们将展示如何在 Spring Boot 项目中集成七牛云存储服务,实现文件上传、列举文件和删除文件等基本功能。七牛云提供强大的文件存储和管理功能,我们可以通过其 Java SDK 来方便地操作云端文件。

前置准备

1. 注册七牛云账户

首先,你需要注册并登录 七牛云官网,创建一个存储空间,并获得 Access KeySecret Key。这些密钥将在接下来的代码中用于认证。
在这里插入图片描述
在这里插入图片描述

2. 创建存储空间(Bucket)

在七牛云控制台中创建一个存储空间(Bucket),并记下空间名称,这将在后续的代码中使用。
在这里插入图片描述

3. 配置 Maven 依赖

你需要在项目中添加七牛云 SDK 的 Maven依赖。

Maven 依赖
<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

4.配置文件application.yml

spring:
  thymeleaf:
    prefix: classpath:/templates/
    check-template-location: true
    suffix: .html
    encoding: UTF-8
    servlet:
      content-type: text/html
    mode: HTML5
    cache: false
  servlet:
    multipart:
      enabled: true
      max-file-size: 30MB
      max-request-size: 30MB

项目结构

本项目包含以下三个主要类:

  • QiniuClient:用于与七牛云进行交互的客户端,提供文件上传、删除和列举功能。
  • QiniuController:控制器层,负责处理用户请求,包括文件上传、文件列表展示和文件删除。
  • QiniuConstant:存储七牛云的 Access KeySecret KeyBucket Name 等常量信息。

1. 创建 QiniuClient 类

QiniuClient 类封装了与七牛云的交互。它提供了获取上传 Token、上传文件、列出文件、删除文件等方法。

package com.shihaohu.qiniuyundemo.core;

import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.FileListing;
import com.qiniu.util.Auth;
import lombok.RequiredArgsConstructor;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * QiniuClient 封装七牛云操作
 * @author Shihao Hu
 * @date 2024/12/2 11:37
 */
@RequiredArgsConstructor
public class QiniuClient {
    private final Auth auth;
    private final UploadManager uploadManager;
    private final BucketManager bucketManager;
    private final String bucketName;

    public QiniuClient(String accessKey, String secretKey, String bucketName) {
        this.auth = Auth.create(accessKey, secretKey);
        Zone z = Zone.autoZone();
        Configuration config = new Configuration(z);
        this.uploadManager = new UploadManager(config);
        this.bucketManager = new BucketManager(auth, config);
        this.bucketName = bucketName;
    }

    /**
     * 获取上传 Token
     */
    public String getUploadToken() {
        return auth.uploadToken(bucketName);
    }

    /**
     * 上传文件
     */
    public void uploadFile(InputStream is, String key) throws QiniuException {
        String uploadToken = getUploadToken();
        uploadManager.put(is, key, uploadToken, null, null);
    }

    /**
     * 列出文件
     */
    public FileListing listFiles() throws QiniuException {
        return bucketManager.listFiles(bucketName, null, null, 1000, null);
    }

    /**
     * 删除文件
     */
    public void deleteFile(String key) throws QiniuException {
        bucketManager.delete(bucketName, key);
    }
}

2. 创建 QiniuController 类

QiniuController 是负责处理文件上传、文件列表显示和文件删除的控制器类。我们为每个功能都创建了一个方法:

package com.shihaohu.qiniuyundemo.controller;

import com.qiniu.common.QiniuException;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.storage.model.FileListing;
import com.shihaohu.qiniuyundemo.constant.QiniuConstant;
import com.shihaohu.qiniuyundemo.core.QiniuClient;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * 处理七牛云相关操作的控制器
 * @author Shihao Hu
 * @date 2024/12/2 11:37
 */
@Controller
@RequestMapping("/qiniu")
public class QiniuController {
    QiniuClient qiniuClient = new QiniuClient(QiniuConstant.ACCESS_KEY, QiniuConstant.SECRET_KEY, QiniuConstant.BUCKET_NAME);

    /**
     * 打开上传页面
     */
    @GetMapping("/upload")
    public String uploadPage() {
        return "/qiniu/upload";
    }

    /**
     * 提交文件上传表单
     */
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile multipartFile, Model model) {
        try {
            String fileName = multipartFile.getOriginalFilename();
            if (fileName == null || fileName.isEmpty()) {
                throw new IllegalArgumentException("File name cannot be empty!");
            }
            InputStream inputStream = multipartFile.getInputStream();
            qiniuClient.uploadFile(inputStream, fileName);
            return "redirect:/qiniu/list";
        } catch (IOException | IllegalArgumentException e) {
            model.addAttribute("msg", e.getMessage());
            return "error";
        }
    }

    /**
     * 列出文件清单
     */
    @GetMapping("/list")
    public String listFiles(Model model) {
        try {
            FileListing fileListing = qiniuClient.listFiles();
            FileInfo[] files = fileListing.items;
            model.addAttribute("fmap", files);
            return "/qiniu/list";
        } catch (QiniuException e) {
            model.addAttribute("msg", e.getMessage());
            return "error";
        }
    }

    /**
     * 删除文件
     */
    @GetMapping("/delete")
    public String deleteFile(@RequestParam("key") String key, Model model) {
        try {
            qiniuClient.deleteFile(key);
            return "redirect:/qiniu/list";
        } catch (QiniuException e) {
            model.addAttribute("msg", e.getMessage());
            return "error";
        }
    }
}

3. 创建 QiniuConstant 类

QiniuConstant 类用于存储七牛云的 ACCESS_KEYSECRET_KEYBUCKET_NAME,这些信息需要你在七牛云控制台中获取。

package com.shihaohu.qiniuyundemo.constant;

/**
 * 七牛云常量类
 * @author Shihao Hu
 * @date 2024/12/2 11:37
 */
public interface QiniuConstant {
    String ACCESS_KEY = "your-access-key";  // 请填写你自己的 Access Key
    String SECRET_KEY = "your-secret-key";  // 请填写你自己的 Secret Key
    String BUCKET_NAME = "your-bucket-name";  // 请填写你自己的存储空间名称
}

4. 创建 Thymeleaf 模板

上传文件页面 /resouces/templates/qiniu/upload.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>七牛文件上传</title>
</head>
<body>
<form name="uploadForm" action="/qiniu/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">&nbsp;&nbsp;<input type="submit" value="上传文件">
</form>
</body>
</html>
文件列表页面 /resouces/templates/qiniu/list.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>七牛文件列表</title>
</head>
<body>
<ul th:each="fitem, stat : ${fmap}">
    <li><a th:href="@{${fitem.key}}"><span th:text="${fitem.key}">文件名</span></a>
        <form action="/qiniu/delete" method="get">
            <input type="hidden" name="key" th:value="${fitem.key}">
            <input type="submit" value="删除">
        </form>
    </li>
</ul>
</body>
</html>

5. 启动 Spring Boot 项目

至此,所有的代码已经完成。你可以通过启动 Spring Boot 项目,访问 http://localhost:8080/qiniu/upload 页面进行文件上传,上传的文件将保存到七牛云存储中。通过 http://localhost:8080/qiniu/list 页面可以查看文件列表,并可以删除文件。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐