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 篇原创文章 · 获赞 1375 · 访问量 210万+

猜你喜欢

转载自blog.csdn.net/qq_15071263/article/details/103710934