OSSClient 已過時,最新版的OSS SDK 插件進行文件上傳

OSSClient 已過時,最新版的OSS SDK 插件進行文件上傳


1、上傳形式

  • 流式上傳
    • 上傳字符串
    • 上傳Byte 數組
    • 上傳網絡流
    • 上傳文件流
  • 文件上傳

2、上傳字符串

// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";

// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 創建PutObjectRequest對象。
String content = "Hello OSS";
// <yourObjectName>表示上傳文件到OSS時需要指定包含文件後綴在內的完整路徑,例如abc/efg/123.jpg。
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content.getBytes()));

// 如果需要上傳時設置存儲類型與訪問權限,請參考以下示例代碼。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);

// 上傳字符串。
ossClient.putObject(putObjectRequest);

// 關閉OSSClient。
ossClient.shutdown();                   

3、上傳Byte數組

// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";

// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);

// 上傳Byte數組。
byte[] content = "Hello OSS".getBytes();
ossClient.putObject("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content));

// 關閉OSSClient。
ossClient.shutdown();

4、上傳網絡流

// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";

// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 上傳網絡流。
InputStream inputStream = new URL("https://www.aliyun.com/").openStream();
ossClient.putObject("<yourBucketName>", "<yourObjectName>", inputStream);

// 關閉OSSClient。
ossClient.shutdown();

5、上傳文件流

// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 雲賬號AccessKey有所有API訪問權限,建議遵循阿里雲安全最佳實踐,創建並使用RAM子賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";

// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 上傳文件流。
InputStream inputStream = new FileInputStream("<yourlocalFile>");
ossClient.putObject("<yourBucketName>", "<yourObjectName>", inputStream);

// 關閉OSSClient。
ossClient.shutdown();

6、上傳本地文件

// Endpoint以杭州爲例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主賬號AccessKey擁有所有API的訪問權限,風險很高。強烈建議您創建並使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建RAM賬號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";

// 創建OSSClient實例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 創建PutObjectRequest對象。
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucketName>", "<yourObjectName>", new File("<yourLocalFile>"));

// 如果需要上傳時設置存儲類型與訪問權限,請參考以下示例代碼。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);

// 上傳文件。
ossClient.putObject(putObjectRequest);

// 關閉OSSClient。
ossClient.shutdown();            

7、組件封裝

所需的pom 依賴

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

1、構建屬性類

@Data
@RefreshScope
public class OssProperties {

  @Value("${plugin.oss.end-point}")
  private String endPoint;
  @Value("${plugin.oss.access-key-id}")
  private String accessKeyId;
  @Value("${plugin.oss.access-key-secret}")
  private String accessKeySecret;
  @Value("${plugin.oss.bucket}")
  private String bucket;
  @Value("${plugin.oss.host}")
  private String host;
}

2、構建dir,使用枚舉更合適,可以自行修改

/**
 * @author Created by 譚健 on 2019/12/25. 星期三. 10:59.
 * © All Rights Reserved.
 *
 * oss 上傳必須使用此類進行路徑鎖定
 */
public class OssDir {
}

3、上傳組件

/**
 * @author Created by 譚健 on 2018/12/3. 星期一. 16:32.
 * © All Rights Reserved.
 * <p>
 * oss 上傳組件
 */
@Slf4j
public class OssComponent {

  private final OssProperties ossProperties;

  public OssComponent(OssProperties ossProperties) {
    this.ossProperties = ossProperties;
  }

  /**
   * 進行文件上傳,支持各種形式的流
   *
   * @param inputStream 輸入流
   * @return 返回上傳後的對象url 地址
   */
  public String simpleUpload(InputStream inputStream, String suffix, String dir) {

    if (inputStream == null) {
      log.error("通過OSS 流式上傳時,輸入流爲空");
      return "";
    }

    String filename = dir + UUID.randomUUID() + "." + suffix;
    this.put(filename, inputStream);

    return resourceUrl(filename);
  }

  /**
   * 上傳某個鏈接地址的內容
   */
  @SneakyThrows(Exception.class)
  public String uploadUrl(String url, String suffix, String dir) {
    return simpleUpload(new URL(url).openStream(), suffix, dir);
  }


  /**
   * 構建請求對象
   *
   * @param filename    文件名
   * @param inputStream 流
   */
  private PutObjectRequest buildRequest(String filename, InputStream inputStream) {
    return new PutObjectRequest(ossProperties.getBucket(), filename, inputStream);
  }

  /**
   * 構建oss 組件
   */
  private OSS buildOss() {
    return new OSSClientBuilder().build(
      ossProperties.getEndPoint(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
  }

  /**
   * 設置存儲類型與訪問權限
   *
   * @param request 文件請求
   */
  private static PutObjectRequest jurisdiction(PutObjectRequest request) {
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
    metadata.setObjectAcl(CannedAccessControlList.PublicRead);
    request.setMetadata(metadata);
    return request;
  }

  /**
   * 獲取上傳到 oss 後文件的鏈接
   */
  private String resourceUrl(String filename) {
    return ossProperties.getHost() + ossProperties.getBucket() + "." + ossProperties.getEndPoint() + "/" + filename;
  }

  /**
   * 把文件傳到  oss
   */
  private void put(String filename, InputStream inputStream) {
    OSS ossClient = this.buildOss();
    ossClient.putObject(
      jurisdiction(
        this.buildRequest(filename, inputStream)
      )
    );
    ossClient.shutdown();
  }

  @PostConstruct
  public void init() {
    log.info("oss 組件被加載到項目中");
  }

}

4、構建啓動器

@Import({
  OssComponent.class,
  OssProperties.class
})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EnableOss {
}

發佈了442 篇原創文章 · 獲贊 1379 · 訪問量 235萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章