七牛云官方文档:https://developer.qiniu.com/kodo/sdk/java

如果有还不会使用SpringBoot整合七牛云存储的小伙伴们,可以跳转查看这篇文章:SpringBoot 整合七牛云上传图片_I’m Jie的博客-CSDN博客

在最近的一个项目中,需要获取在七牛云中存储的所有图片,并返回外链地址,具体代码实现如下。

获取七牛云密钥

  1. 进入七牛云控制台

    image-20220131212145277

  2. 点击【头像】→【密钥管理】

    image-20220131212100619

  3. 创建密钥,复制保存,下面要用

    image-20220131212314100

导入依赖

  • 从 7.2.24 开始,okhttp3 升级到 3.14.2,其要求 java 1.8 及以上。
  • 若一定 java 1.7 ,请手动指定 okhttp3 依赖 3.12,要求 3.12.3 及以上, com.squareup.okhttp3:okhttp:3.12.3
1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.11.0</version>
</dependency>

编辑 YAML 配置文件

在配置文件中添加七牛云的一些参数:

1
2
3
4
5
6
7
#七牛云参数
qiniu:
accessKey: IrgJ4tvtYwWMr # AK
accessSecretKey: J-0wUai568ul7L # SK
bucket: yunpicos # 空间
prefix: word/ # 文件名路径前缀,用于过滤,默认为空
domain: http://img.roman.top/ # 域名

添加七牛云配置类

封装七牛云需要的配置参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Getter
@Configuration
public class QiNiuConfig {

//七牛云 ak
@Value("${qiniu.accessKey}")
private String accessKey;

//七牛云sk
@Value("${qiniu.accessSecretKey}")
private String secretKey;

//指定七牛云空间
@Value("${qiniu.bucket}")
private String bucket;

//文件名路径前缀
@Value("${qiniu.prefix:}")
private String prefix;

//指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
@Value("${qiniu.delimiter:}")
private String delimiter;

//七牛云空间的域名
@Value("${qiniu.domain:}")
private String domain;

}

编写 QiNiuImgUrls 方法

返回所有图片外链的集合,外链格式为【域名+文件路径】:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public List<String> imgUrls(){
//参数
String accessKey = qiNiuConfig.getAccessKey();
String secretKey = qiNiuConfig.getSecretKey();
String bucket = qiNiuConfig.getBucket();
String prefix = qiNiuConfig.getPrefix();
String delimiter = qiNiuConfig.getDelimiter();
String domain = qiNiuConfig.getDomain();

//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.region0());

Auth auth = Auth.create(accessKey, secretKey);

BucketManager bucketManager = new BucketManager(auth, cfg);

//每次迭代的长度限制,最大1000,推荐值 1000
int limit = 1000;

//列举空间文件列表
BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit, delimiter);
while (fileListIterator.hasNext()) {
//处理获取的file list结果
FileInfo[] items = fileListIterator.next();
//stream流过滤掉掉多余的元素,并将其余元素的所有文件路径和域名进行拼接,返回所有图片外链的集合
List<String> collect = Arrays.stream(items).filter(f -> !f.key.equals(prefix)).map(f -> domain+f.key).collect(Collectors.toList());
return collect;
}
return null;
}

测试结果

返回对应空间下的所有图片的外链:

image-20230609152419286