Skip to content

本章讲解阿里云OSS是如何引入到SpringBoot项目中去的,从依赖到配置再到工具类的编写,保证能直接到真实上线的项目中去,

项目依赖

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

如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖。添加jaxb相关依赖示例代码如下:

xml
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

除此之外项目还用到了Hutool工具包用来生成日期,用于设置文件存放位置

xml
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.5</version>
</dependency>

配置文件

我们在application.yml配置文件中输入如下信息

yaml
xk857:
  aliyun:
    endpoint: https://oss-cn-shanghai.aliyuncs.com   # oss端点
    accessKeyId: AAAAI5t7Fy*****SADtASDj
    accessKeySecret: JCASAI32y******pNa4cmmSSAocy
    bucketName: student-xk857 #bucket名称
    bucketDomain: https://oss.xk857.com/ #Bucket 域名

读取配置文件

java
@Data
@Component
@ConfigurationProperties(prefix = "xk857.aliyun")
public class AliyunProperties {

    /**
     * 阿里云地域节点
     */
    private String endpoint;

    /**
     * accessKeyId
     */
    private String accessKeyId;

    /**
     * accessKeySecret
     */
    private String accessKeySecret;

    /**
     * 存储空间名称
     */
    private String bucketName;

    /**
     * Bucket域名,访问文件时作为URL前缀
     */
    private String bucketDomain;
}

将OSSClient实例注入到Bean中

OSSClient是用于发送请求到阿里云的,如果每次上传文件都重新创建,那么会影响系统的性能,高并发下容易导致系统崩溃

java
@Component
public class AliBaseBean {

    @Autowired
    private AliyunProperties aliyunProperties;

    @Bean
    public OSS getOssClient(){
        OSS oss = new OSSClientBuilder().build(aliyunProperties.getEndpoint(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
        return oss;
    }

}

阿里云OSS工具类

工具类包含上传文件和删除文件,使用@Component让Spring扫描到此工具类,方法中获取阿里云OSS客户端实例和配置信息,完成文件上传与删除逻辑。

java
@Slf4j
@Component
public class AliOssUtils {

    @Autowired
    private AliBaseBean aliBaseBean;

    @Autowired
    private AliyunProperties aliyunProperties;

    /**
     * 文件上传文件
     * @param file MultipartFile文件对象
     * @return 文件地址
     */
    public String uploadFileToOss(MultipartFile file) {
        // 上传文件所在目录名,当天上传的文件放到当天日期的目录下。
        String folderName = "simple_efficient/" + DateUtil.format(new Date(), "yyyyMMdd");
        // 保存到 OSS 中的文件名,采用 UUID 命名。
        String fileName = UUID.randomUUID().toString().replace("-", "");
        // 从原始文件名中,获取文件扩展名
        String fileExtensionName = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf("."));
        // 文件在 OSS 中存储的完整路径
        String filePath = folderName + "/" + fileName + fileExtensionName;
        // 获取存储再Bean中的Client实例对象,防止重复创建
        OSS ossClient = aliBaseBean.getOssClient();

        // 上传文件到OSS 并响应结果
        PutObjectResult putObjectResult = null;
        try {
            putObjectResult = ossClient.putObject(aliyunProperties.getBucketName(), filePath, file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

        ResponseMessage response = putObjectResult.getResponse();
        if (response == null) {
            // 上传成功 返回上传文件的访问完整路径
            return aliyunProperties.getBucketDomain() + filePath;
        } else {
            // 上传失败,OOS服务端会响应状态码和错误信息
            String errorMsg = "响应的错误状态码是【" + response.getStatusCode() + "】," + "错误信息【" + response.getErrorResponseAsString() + "】";
            log.info("【上传图片出错】" + errorMsg);
            // TODO 实际项目中应该抛出异常,为了防止新人观看看不懂如何使用的,这里直接返回字符串了
            return errorMsg;
        }
    }


    /**
     * 根据文件url删除
     * @param fileUrl 文件地址
     */
    public boolean deleteFile(String fileUrl) {
        // 去除文件 url 中的 Bucket域名
        String filePath = fileUrl.replace(aliyunProperties.getBucketDomain(), "");

        OSS ossClient = aliBaseBean.getOssClient();
        try {
            // 删除
            ossClient.deleteObject(aliyunProperties.getBucketName(), filePath);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}