SpringBoot整合阿里云OSS

  一、参考项

阿里云 OSS(官网):  对象存储OSS_云存储服务_企业数据管理_存储-阿里云
OSS SDK for Java(官网): 简介 - 对象存储 OSS - 阿里云

三、引入Pom文件

<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.14.0</version>
</dependency>

二、定义抽象类

public abstract class BaseObjectStorage {

    /**
     * 上传文件
     *
     * @param pathAndName
     * @param file
     */
    public abstract void upload(String pathAndName, File file);

    /**
     * 授权
     *
     * @param pathAndName
     * @param time
     * @return
     */
    public abstract String authorize(String pathAndName, long time);

    /**
     * 授权(路径全)
     *
     * @param pathAndName
     * @param time
     * @return
     */
    public abstract String authorizeAllName(String pathAndName, long time);

    /**
     * 临时上传文件授权
     *
     * @param dir
     * @return
     */
    public abstract Map<String, Object> tokens(String dir);

    /**
     * 删除文件
     *
     * @param pathAndName
     */
    public abstract void deleteFile(String pathAndName);

}

三、OSS实现类

package cn.xhh.xhh.core.objectstorage;

import java.io.File;
import java.net.URL;
import java.util.Date;
import java.util.Map;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.aliyun.oss.model.PutObjectRequest;
import com.google.common.collect.Maps;
import lombok.Data;

@Slf4j
@Component
public class OssObjectStorage extends BaseObjectStorage {

  @Data
  @Component
  @ConfigurationProperties(prefix = "oss")
  public static class OssInfo {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String rootDirectory;
  }

  @Autowired
  private OssInfo ossInfo;

  @Override
  public void upload(String pathAndName, File file) {
    OSS ossClient = new OSSClientBuilder().build(ossInfo.endpoint, ossInfo.accessKeyId,
        ossInfo.accessKeySecret);
    try {
      ossClient.putObject(
          new PutObjectRequest(ossInfo.bucketName, ossInfo.rootDirectory + pathAndName, file));
    } finally {
      ossClient.shutdown();
    }

  }

  @Override
  public String authorize(String pathAndName, long time) {
    OSS ossClient = new OSSClientBuilder().build(ossInfo.endpoint, ossInfo.accessKeyId,
        ossInfo.accessKeySecret);
    try {
      Date expiration = new Date(new Date().getTime() + time);
      URL url = ossClient.generatePresignedUrl(ossInfo.bucketName,
          ossInfo.rootDirectory + pathAndName, expiration);
      return url.toString();
    } finally {
      ossClient.shutdown();
    }
  }

  @Override
  public String authorizeAllName(String pathAndName, long time) {
    OSS ossClient = new OSSClientBuilder().build(ossInfo.endpoint, ossInfo.accessKeyId,
        ossInfo.accessKeySecret);
    try {
      Date expiration = new Date(new Date().getTime() + time);
      URL url = ossClient.generatePresignedUrl(ossInfo.bucketName, pathAndName, expiration);
      return url.toString();
    } finally {
      ossClient.shutdown();
    }
  }

  @Override
  public Map<String, Object> tokens(String dir) {
    Map<String, Object> result = Maps.newHashMap();
    OSS ossClient = new OSSClientBuilder().build(ossInfo.endpoint, ossInfo.accessKeyId,
        ossInfo.accessKeySecret);
    try {
      long expireTime = 60;
      long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
      Date expiration = new Date(expireEndTime);
      PolicyConditions policyConds = new PolicyConditions();
      policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
      dir = "frontend/xhh/" + dir;
      policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
      String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
      byte[] binaryData = postPolicy.getBytes("utf-8");
      String encodedPolicy = BinaryUtil.toBase64String(binaryData);
      String postSignature = ossClient.calculatePostSignature(postPolicy);
      result.put("storeType", "oss");
      result.put("storageType", "oss");
      result.put("accessId", ossInfo.accessKeyId);
      result.put("policy", encodedPolicy);
      result.put("signature", postSignature);
      result.put("expire", String.valueOf(expireEndTime / 1000));
      result.put("dir", dir);
      result.put("host", ossInfo.endpoint.split("://")[0] + "://" + ossInfo.bucketName + "."
          + ossInfo.endpoint.split("://")[1]);
    } catch (Exception e) {
      log.error("oss 上传异常。", e);
    } finally {
      ossClient.shutdown();
    }
    return result;
  }

  @Override
  public void deleteFile(String pathAndName) {
    OSS ossClient = new OSSClientBuilder().build(ossInfo.endpoint, ossInfo.accessKeyId,
        ossInfo.accessKeySecret);
    try {
      ossClient.deleteObject(ossInfo.bucketName, ossInfo.rootDirectory + pathAndName);
    } finally {
      ossClient.shutdown();
    }

  }

}

四、application配置文件

objectstorage.type: oss
oss:
  endpoint: https://oss-cn-xhh.aliyuncs.com
  access-key-id: LTAI4GKXXXYuEzsXXXXyY63x
  access-key-secret: BXXXPwUVZr8XXXXjFMPjkw
  bucket-name: data
  root-directory: xhh/export/

猜你喜欢

转载自blog.csdn.net/u010953816/article/details/123357047