ApiBoot 整合 阿里云对象存储OSS

ApiBoot添加快速集成Aliyun的对象存储服务Oss,提供常用的文件操作方法,当然也提供自定义扩展,以致于满足绝大数业务场景,并且通过扩展可以实现上传文件进度条、下载文件进度条、存储空间操作、静态网站托管、访问日志、防盗链、分片上传、追加上传、断点续传等等。

引入ApiBoot Alibaba Oss

pom.xml配置文件内添加依赖,如下所示:

  1. <!--ApiBoot Alibaba Oss-->
  2. <dependency>
  3. <groupId>org.minbox.framework</groupId>
  4. <artifactId>api-boot-starter-alibaba-oss</artifactId>
  5. </dependency>

注意:如果未添加ApiBoot版本依赖,请访问版本依赖查看添加方式。

配置参数列表

配置参数参数介绍默认值是否必填
api.boot.oss.regionoss所属地域
api.boot.oss.bucket-nameoss存储空间名称
api.boot.oss.access-key-id阿里云账户accessKeyId
api.boot.oss.access-key-secret阿里云账户accessKeySecret
api.boot.oss.domainoss存储空间所绑定的自定义域名,如果不配置,上传文件成功后返回默认格式化的文件访问路径

上传文件

在使用ApiBoot Oss时,只需要注入ApiBootOssService类就可以完成默认方法的使用,如下所示:

  1. @Autowired
  2. private ApiBootOssService apiBootOssService;

流上传

  1. /**
  2. * 流方式上传
  3. */
  4. @Test
  5. public void uploadBytes() {
  6. ApiBootObjectStorageResponse response = apiBootOssService.upload("admin.txt", "admin".getBytes());
  7. logger.info("文件名称:{}", response.getObjectName());
  8. logger.info("文件访问路径:{}", response.getObjectUrl());
  9. }

本地文件上传

  1. /**
  2. * 本地文件上传
  3. */
  4. @Test
  5. public void uploadFile() {
  6. ApiBootObjectStorageResponse response = apiBootOssService.upload("logo.png", "/Users/yuqiyu/Downloads/logo.png");
  7. logger.info("文件名称:{}", response.getObjectName());
  8. logger.info("文件访问路径:{}", response.getObjectUrl());
  9. }

文件流上传

  1. /**
  2. * 文件流方式上传
  3. *
  4. * @throws Exception
  5. */
  6. @Test
  7. public void uploadInputStream() throws Exception {
  8. FileInputStream inputStream = new FileInputStream(new File("/Users/yuqiyu/Downloads/logo.png"));
  9. ApiBootObjectStorageResponse response = apiBootOssService.upload("测试.png", inputStream);
  10. logger.info("文件名称:{}", response.getObjectName());
  11. logger.info("文件访问路径:{}", response.getObjectUrl());
  12. }

通过文件的输入流完成对象存储文件的上传

下载文件

  1. /**
  2. * 下载文件
  3. */
  4. @Test
  5. public void download() {
  6. apiBootOssOverrideService.download("测试.png", "/Users/yuqiyu/Downloads/测试.png");
  7. }

在上面的示例中,文件会自动下载到/Users/yuqiyu/Downloads/目录下,文件名称为测试.png

删除文件

  1. /**
  2. * 删除文件示例
  3. */
  4. @Test
  5. public void delete() {
  6. apiBootOssOverrideService.delete("测试.png");
  7. }

删除对象存储空间内的文件时只需要传递文件名即可。

MultipartFile 上传文件

如果你是通过SpringMvc提供的MultipartFile对象进行上传文件,可以通过如下示例进行上传:

  1. MultipartFile multipartFile = ..;
  2. // 流方式上传
  3. ApiBootObjectStorageResponse responseByte = apiBootOssService.upload("测试.png", multipartFile.getBytes());
  4. // 文件输入流方式上传
  5. ApiBootObjectStorageResponse responseIs = apiBootOssService.upload("测试.png", multipartFile.getInputStream());

分片上传

ApiBoot集成了分片上传,只需要一个方法就可以把大文件进行分片上传,ApiBoot会自动根据partSize进行整理分片数量,如下所示:

  1. ApiBootObjectStorageResponse response = apiBootOssService
  2. .multipartUpload(
  3. "初识ApiBoot.mp4",
  4. //路径方式:"/Users/yuqiyu/Downloads/fa2a664e-f827-cfab-7323-3583b3ffd00c.mp4",
  5. // 文件对象方式
  6. new File("/Users/yuqiyu/Downloads/fa2a664e-f827-cfab-7323-3583b3ffd00c.mp4"),
  7. PartSize.MB);
  8. System.out.println("文件名称:" + response.getObjectName());
  9. System.out.println("文件路径:" + response.getObjectUrl());

方法参数描述:

  • 文件名称
  • 本地文件路径
  • 每一个part的大小,可以直接使用ApiBoot提供的PartSize接口常量来进行计算。

自定义扩展

ApiBoot Alibaba Oss提供的方法毕竟是有限的,因此ApiBoot提供了自定义的扩展方式,让使用者可以根据Oss官方文档进行扩展,包含上传文件进度条、下载文件进度条、存储空间操作、静态网站托管、访问日志、防盗链、分片上传、追加上传、断点续传等等。

自定义扩展首先需要创建类并继承ApiBootOssService,如下所示:

  1. //...
  2. public class ApiBootOssOverrideService extends ApiBootOssService {
  3. /**
  4. * logger instance
  5. */
  6. static Logger logger = LoggerFactory.getLogger(ApiBootOssOverrideService.class);
  7. /**
  8. * 实现父类构造函数
  9. *
  10. * @param endpoint 外网节点
  11. * @param bucketName 存储空间名称
  12. * @param accessKeyId 阿里云账号授权Id
  13. * @param accessKeySecret 阿里云账号授权Secret
  14. * @param domain 自定义域名
  15. */
  16. public ApiBootOssOverrideService(String endpoint, String bucketName, String accessKeyId, String accessKeySecret, String domain) {
  17. super(endpoint, bucketName, accessKeyId, accessKeySecret, domain);
  18. }
  19. /**
  20. * 创建bucket存储
  21. *
  22. * @param bucketName 存储名称
  23. */
  24. public void createBucket(String bucketName) {
  25. OSSClient ossClient = getOssClient();
  26. Bucket bucket = ossClient.createBucket(bucketName);
  27. logger.info("新创建存储空间名称:{}", bucket.getName());
  28. logger.info("新创建存储空间所属人:{}", bucket.getOwner().getDisplayName());
  29. closeOssClient(ossClient);
  30. }
  31. }

如上createBucket方法所示ApiBootOssService内部提供了获取OssClient以及关闭OssClient连接的方法,可以直接调用。

扩展生效

我们自定义的扩展,需要将实例放入SpringIOC容器内,方便我们在使用处进行注入,要注意,由于构造函数参数的原因,无法直接通过@Service或者@Component注解进行标注,需要通过如下方式:

  1. //...
  2. @Bean
  3. @ConditionalOnMissingBean
  4. ApiBootOssOverrideService apiBootOssOverrideService(ApiBootOssProperties apiBootOssProperties) {
  5. return new ApiBootOssOverrideService(apiBootOssProperties.getRegion().getEndpoint(), apiBootOssProperties.getBucketName(), apiBootOssProperties.getAccessKeyId(), apiBootOssProperties.getAccessKeySecret(), apiBootOssProperties.getDomain());
  6. }

ApiBootOssProperties属性配置类,是ApiBoot内置的,可以在任意地方进行注入,这里目的只是为了拿到相关配置进行构造参数实例化使用。