Spring Boot 对接七牛云存储的详细步骤和流程

189 阅读3分钟

以下是 Spring Boot 对接七牛云存储的详细步骤和流程,结合了多个开发实践和最佳方案:

image.png


​一、前期准备​

  1. ​注册七牛云账号​

    • 访问七牛云官网,完成注册并登录。
    • 进入「密钥管理」获取 Access KeySecret Key(用于鉴权)。
  2. ​创建存储空间(Bucket)​

    • 在控制台选择「对象存储」,创建新的存储空间,命名后记录 Bucket 名称
    • 设置存储空间属性(如存储类型、地域等),获取存储空间的访问域名(如 http://xxx.bkt.clouddn.com)。

​二、Spring Boot 项目配置​

1. ​​添加依赖​

pom.xml 中引入七牛云 Java SDK:

<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>[7.2.0, 7.7.99]</version>
</dependency>

​注意​​:版本号需根据最新网页调整。

2. ​​配置参数​

application.yml 中添加七牛云配置:

qiniu:
  accessKey: your_access_key
  secretKey: your_secret_key
  bucket: your_bucket_name
  domain: http://xxx.bkt.clouddn.com  # 存储空间访问域名
  region: huadong  # 存储空间所在地域(如华东:huadong)

3. ​​配置类​

创建 QiniuProperties 类绑定配置:

@Data
@ConfigurationProperties(prefix = "qiniu")
public class QiniuProperties {
    private String accessKey;
    private String secretKey;
    private String bucket;
    private String domain;
    private String region;
}

​三、实现文件上传功能​

1. ​​工具类开发​

创建 QiniuUtils 工具类,封装上传逻辑:

@Component
public class QiniuUtils {
    @Autowired
    private QiniuProperties qiniuProperties;

    // 上传文件到七牛云
    public String uploadFile(MultipartFile file) {
        try {
            Configuration cfg = new Configuration(Region.region2()); // 根据实际地域选择
            UploadManager uploadManager = new UploadManager(cfg);
            
            Auth auth = Auth.create(qiniuProperties.getAccessKey(), qiniuProperties.getSecretKey());
            String upToken = auth.uploadToken(qiniuProperties.getBucket());
            
            // 生成唯一文件名(避免重复)
            String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
            
            // 上传并解析结果
            Response response = uploadManager.put(file.getBytes(), fileName, upToken);
            DefaultPutRet putRet = JSON.parseObject(response.bodyString(), DefaultPutRet.class);
            
            // 返回完整访问路径
            return qiniuProperties.getDomain() + "/" + putRet.key;
        } catch (Exception e) {
            throw new RuntimeException("上传失败:" + e.getMessage());
        }
    }
}

​关键点​​:

  • 使用 Region 指定存储区域(如 Region.huadong() 对应华东)。
  • 文件名通过 UUID 生成唯一标识,保留原始后缀。

2. ​​Controller 层​

创建接口接收前端上传请求:

@RestController
@RequestMapping("/file")
public class FileController {
    @Autowired
    private QiniuUtils qiniuUtils;

    @PostMapping("/upload")
    public R uploadFile(@RequestParam("file") MultipartFile file) {
        String url = qiniuUtils.uploadFile(file);
        return R.success(url);
    }
}

​四、扩展功能​

1. ​​文件下载​

通过七牛云域名直接访问文件,或生成带签名的临时下载链接:

public String generateDownloadUrl(String key) {
    Auth auth = Auth.create(accessKey, secretKey);
    return auth.privateDownloadUrl(domain + "/" + key, 3600); // 1小时有效
}

2. ​​文件删除​

使用 BucketManager 删除指定文件:

public void deleteFile(String key) {
    Auth auth = Auth.create(accessKey, secretKey);
    BucketManager bucketManager = new BucketManager(auth, config);
    bucketManager.delete(bucketName, key);
}

3. ​​文件列表查询​

遍历存储空间中的文件(分页处理):

public List<String> listFiles(String prefix, String marker) {
    Auth auth = Auth.create(accessKey, secretKey);
    BucketManager bucketManager = new BucketManager(auth, config);
    BucketManager.FileListIterator fileListIterator = 
        bucketManager.createFileListIterator(bucketName, prefix, 1000, marker);
    
    List<String> fileList = new ArrayList<>();
    while (fileListIterator.hasNext()) {
        FileInfo[] items = fileListIterator.next();
        for (FileInfo item : items) {
            fileList.add(item.key);
        }
    }
    return fileList;
}

​五、前端集成示例​

1. ​​HTML 表单​

<form action="/file/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <button type="submit">上传</button>
</form>

2. ​​AJAX 上传(jQuery)​

$.ajax({
    url: "/file/upload",
    type: "POST",
    data: new FormData($("#uploadForm")[0]),
    processData: false,
    contentType: false,
    success: function(res) {
        console.log("上传成功:" + res.data);
    }
});

​六、注意事项​

  1. ​文件大小限制​
    application.yml 中配置:

    spring:
      servlet:
        multipart:
          max-file-size: 10MB
          max-request-size: 50MB
    
  2. ​异常处理​
    添加全局异常处理器,捕获七牛云 SDK 抛出的 QiniuException

  3. ​安全性​

    • 敏感操作(如删除)需添加权限校验。
    • 临时下载链接建议设置短有效期。

通过以上步骤,即可实现 Spring Boot 与七牛云存储的完整对接,支持文件上传、下载、删除及列表查询等核心功能。实际开发中可根据需求扩展图片处理(如缩略图)、水印添加等高级功能。