SpringBoot整合阿里云OSS对象存储服务的实现

 更新时间:2020年08月10日 10:57:30   作者:Mistra丶  
这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

今天来整合一下SpringBoot和阿里云OSS对象存储服务。

一、配置OSS服务

先在阿里云开通对象存储服务,拿到AccessKeyId、AccessKeySecret。


创建你的bucket(存储空间),相当于一个一个的文件夹目录。按业务需求分类存储你的文件,图片,音频,app包等等。创建bucket是要选择该bucket的权限,私有,公共读,公共读写,按需求选择。创建bucket时对应的endpoint要记住,上传文件需要用到。


可以配置bucket的生命周期,比如说某些文件有过期时间的,可以配置一下。

二、代码实现

引入依赖包

<dependency>
  <groupId>com.aliyun.oss</groupId>
  <artifactId>aliyun-sdk-oss</artifactId>
  <version>2.8.3</version>
</dependency>

配置文件application.yml

aliyun-oss:
 #bucket名称
 bucketApp: xxx-app
 domainApp: https://xxx-app.oss-cn-shenzhen.aliyuncs.com/
 region: oss-cn-shenzhen
 endpoint : https://oss-cn-shenzhen.aliyuncs.com
 accessKeyId: 你的accessKeyId
 accessKeySecret: 你的accessKeySecret

对应上面配置文件的properties类

package com.example.file.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "aliyun-oss")
@Data
public class AliyunOSSProperties {

  /**
   * 服务器地点
   */
  private String region;
  /**
   * 服务器地址
   */
  private String endpoint;
  /**
   * OSS身份id
   */
  private String accessKeyId;
  /**
   * 身份密钥
   */
  private String accessKeySecret;

  /**
   * App文件bucketName
   */
  private String bucketApp;
  /**
   * App包文件地址前缀
   */
  private String domainApp;
}

上传文件工具类

package com.example.file.utils;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import com.example.common.exception.BusinessErrorCode;
import com.example.common.exception.BusinessException;
import com.example.common.utils.FileIdUtils;
import com.example.file.config.AliyunOSSProperties;
import com.example.file.config.FileTypeEnum;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

@Component
public class AliyunOSSUtil {

  @Autowired
  private AliyunOSSProperties aliyunOSSProperties;

  private static Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class);

  /**
   * 文件不存在
   */
  private final String NO_SUCH_KEY = "NoSuchKey";
  /**
   * 存储空间不存在
   */
  private final String NO_SUCH_BUCKET = "NoSuchBucket";

  /**
   * 上传文件到阿里云 OSS 服务器
   *
   * @param files
   * @param fileTypeEnum
   * @param bucketName
   * @param storagePath
   * @return
   */
  public List<String> uploadFile(MultipartFile[] files, FileTypeEnum fileTypeEnum, String bucketName, String storagePath, String prefix) {
    //创建OSSClient实例
    OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
    List<String> fileIds = new ArrayList<>();
    try {
      for (MultipartFile file : files) {
      		//创建一个唯一的文件名,类似于id,就是保存在OSS服务器上文件的文件名(自定义文件名)
        String fileName = FileIdUtils.creater(fileTypeEnum.getCode());
        InputStream inputStream = file.getInputStream();
        ObjectMetadata objectMetadata = new ObjectMetadata();
        //设置数据流里有多少个字节可以读取
        objectMetadata.setContentLength(inputStream.available());
        objectMetadata.setCacheControl("no-cache");
        objectMetadata.setHeader("Pragma", "no-cache");
        objectMetadata.setContentType(file.getContentType());
        objectMetadata.setContentDisposition("inline;filename=" + fileName);
        fileName = StringUtils.isNotBlank(storagePath) ? storagePath + "/" + fileName : fileName;
        //上传文件
        PutObjectResult result = ossClient.putObject(bucketName, fileName, inputStream, objectMetadata);
        logger.info("Aliyun OSS AliyunOSSUtil.uploadFileToAliyunOSS,result:{}", result);
        fileIds.add(prefix + fileName);
      }
    } catch (IOException e) {
      logger.error("Aliyun OSS AliyunOSSUtil.uploadFileToAliyunOSS fail,reason:{}", e);
    } finally {
      ossClient.shutdown();
    }
    return fileIds;
  }

  /**
   * 删除文件
   *
   * @param fileName
   * @param bucketName
   */
  public void deleteFile(String fileName, String bucketName) {
    OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
    ossClient.deleteObject(bucketName, fileName);
    shutdown(ossClient);
  }

  /**
   * 根据图片全路径删除就图片
   *
   * @param imgUrl   图片全路径
   * @param bucketName 存储路径
   */
  public void delImg(String imgUrl, String bucketName) {
    if (StringUtils.isBlank(imgUrl)) {
      return;
    }
    //问号
    int index = imgUrl.indexOf('?');
    if (index != -1) {
      imgUrl = imgUrl.substring(0, index);
    }
    int slashIndex = imgUrl.lastIndexOf('/');
    String fileId = imgUrl.substring(slashIndex + 1);
    OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
    ossClient.deleteObject(bucketName, fileId);
    shutdown(ossClient);
  }

  /**
   * 判断文件是否存在
   *
   * @param fileName  文件名称
   * @param bucketName 文件储存空间名称
   * @return true:存在,false:不存在
   */
  public boolean doesObjectExist(String fileName, String bucketName) {
    Validate.notEmpty(fileName, "fileName can be not empty");
    Validate.notEmpty(bucketName, "bucketName can be not empty");
    OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
    try {
      boolean found = ossClient.doesObjectExist(bucketName, fileName);
      return found;
    } finally {
      shutdown(ossClient);
    }

  }

  /**
   * 复制文件
   *
   * @param fileName       源文件名称
   * @param bucketName      源储存空间名称
   * @param destinationBucketName 目标储存空间名称
   * @param destinationObjectName 目标文件名称
   */
  public void ossCopyObject(String fileName, String bucketName, String destinationBucketName, String destinationObjectName) {
    Validate.notEmpty(fileName, "fileName can be not empty");
    Validate.notEmpty(bucketName, "bucketName can be not empty");
    Validate.notEmpty(destinationBucketName, "destinationBucketName can be not empty");
    Validate.notEmpty(destinationObjectName, "destinationObjectName can be not empty");
    OSSClient ossClient = new OSSClient(aliyunOSSProperties.getEndpoint(), aliyunOSSProperties.getAccessKeyId(), aliyunOSSProperties.getAccessKeySecret());
    // 拷贝文件。
    try {
      ossClient.copyObject(bucketName, fileName, destinationBucketName, destinationObjectName);
    } catch (OSSException oe) {
      logger.error("errorCode:{},Message:{},requestID:{}", oe.getErrorCode(), oe.getMessage(), oe.getRequestId());
      if (oe.getErrorCode().equals(NO_SUCH_KEY)) {
        throw new BusinessException(BusinessErrorCode.NO_SUCH_KEY);
      } else if (oe.getErrorCode().equals(NO_SUCH_BUCKET)) {
        throw new BusinessException(BusinessErrorCode.NO_SUCH_BUCKET);
      } else {
        throw new BusinessException(BusinessErrorCode.FAIL);
      }
    } finally {
      shutdown(ossClient);
    }
  }

  /**
   * 关闭oos
   *
   * @param ossClient ossClient
   */
  private void shutdown(OSSClient ossClient) {
    ossClient.shutdown();
  }
}

文件类型枚举

package com.example.file.config;

public enum FileTypeEnum {

  IMG(1, "图片"),
  AUDIO(2, "音频"),
  VIDEO(3, "视频"),
  APP(4, "App包"),
  OTHER(5, "其他");

  private Integer code;
  private String message;

  FileTypeEnum(Integer code, String message) {
    this.code = code;
    this.message = message;
  }

  public Integer getCode() {
    return code;
  }

  public String getMessage() {
    return message;
  }

}

调用工具类上传文件

@Override
  public List<String> uploadImg(MultipartFile[] files) {
    if (files == null) {
      throw new BusinessException(BusinessErrorCode.OPT_UPLOAD_FILE);
    }
    try {
      return aliyunOSSUtil.uploadFile(files, FileTypeEnum.IMG, aliyunOSSProperties.getBucketProduct(), null, aliyunOSSProperties.getDomainProduct());
    } catch (Exception e) {
      logger.error("uploadImg error e:{}", e);
      throw new BusinessException(BusinessErrorCode.UPLOAD_FAIL);
    }
  }

返回的List是文件上传之后文件的文件名集合。
到此就整合完成了。可以登录OSS控制台查看对应的文件。更多相关SpringBoot整合阿里云OSS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用java和sqlserver建立简易图书管理系统的完整步骤

    利用java和sqlserver建立简易图书管理系统的完整步骤

    图书馆管理系统是图书馆管理工作中不可缺少的部分,它对于图书馆的管理者和使用者都非常重要,下面这篇文章主要给大家介绍了关于利用java和sqlserver建立简易图书管理系统的完整步骤,需要的朋友可以参考下
    2022-06-06
  • 详解spring cloud整合Swagger2构建RESTful服务的APIs

    详解spring cloud整合Swagger2构建RESTful服务的APIs

    这篇文章主要介绍了详解spring cloud整合Swagger2构建RESTful服务的APIs,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Eclipse设置svn忽略文件或文件夹(svn:ignore)的操作

    Eclipse设置svn忽略文件或文件夹(svn:ignore)的操作

    这篇文章主要介绍了Eclipse设置svn忽略文件或文件夹(svn:ignore)的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • SpringBoot 实现微信推送模板的示例代码

    SpringBoot 实现微信推送模板的示例代码

    这篇文章主要介绍了SpringBoot 实现微信推送模板,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Spring Cloud下OAUTH2注销的实现示例

    Spring Cloud下OAUTH2注销的实现示例

    本篇文章主要介绍了Spring Cloud下OAUTH2注销的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • SpringBoot项目的测试类实例解析

    SpringBoot项目的测试类实例解析

    这篇文章主要介绍了SpringBoot项目的测试类实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java 分行读取实例

    java 分行读取实例

    今天小编就为大家分享一篇java 分行读取实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java链表中元素删除的实现方法详解【只删除一个元素情况】

    Java链表中元素删除的实现方法详解【只删除一个元素情况】

    这篇文章主要介绍了Java链表中元素删除的实现方法,结合实例形式分析了java只删除链表中一个元素的相关操作原理、实现方法与注意事项,需要的朋友可以参考下
    2020-03-03
  • 如何使用JCTools实现Java并发程序

    如何使用JCTools实现Java并发程序

    这篇文章主要介绍了如何使用JCTools实现Java并发程序,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • jvm细节探索之synchronized及实现问题分析

    jvm细节探索之synchronized及实现问题分析

    这篇文章主要介绍了jvm细节探索之synchronized及实现问题分析,涉及synchronized的字节码表示,JVM中锁的优化,对象头的介绍等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11

最新评论