阿里云OSS同区域不同bucket文件复制

前几天一个朋友让我帮他把几个OSS里的不同bucket文件进行复制,就是将都在华北2区的名称为A的bucket的文件全部复制到B中。 如果是不同区域的,可以直接在后台。同一区域的,目前我查找文档好像就两种方法,一种是下载到本地,手动上传;一种是用 SDK API 上传。 本文介绍使用 Java SDK 来复制两个仓库里的文件。 具体步骤如下 1、创建一个 Java 工程 可以是 Maven 项目,也可以是一个普通的 Java 项目   2、添加依赖
  1. <dependency>
  2.         <groupId>com.aliyun.oss</groupId>
  3.         <artifactId>aliyun-sdk-oss</artifactId>
  4.         <version>2.8.3</version>
  5. </dependency>
也可以直接下载官方的jar包,添加到环境中   3、Demo 代码
  1. package com.example.demo;
  2. import com.aliyun.oss.OSSClient;
  3. import com.aliyun.oss.model.*;
  4. import lombok.extern.slf4j.Slf4j;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. @Slf4j
  8. public class Demo {
  9.     // Endpoint以北京为例,其它Region请按实际情况填写。
  10.     public final static String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
  11.     //accessKey
  12.     public final static String ACCESS_KEY_ID = "xxxxx";
  13.     //accessKey secret
  14.     public final static String ACCESS_KEY_SECRET = "xxxxxxx";
  15.     //源bucket名
  16.     public final static String SOURCE_BUCKET_NAME = "xxxxxxx";
  17.     //目标bucket名
  18.     public final static String TARGET_BUCKET_NAME = "xxxxxxx";
  19.     /**
  20.      * 获得文件列表
  21.      * @return
  22.      */
  23.     public static List<String> listKeys() {
  24.         List<String> keyList = new ArrayList<>();
  25.         // 创建OSSClient实例。
  26.         OSSClient ossClient = new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
  27.         // 设置最大个数。
  28.         final int maxKeys = 200;
  29.         String nextMarker = null;
  30.         ObjectListing objectListing;
  31.         do {
  32.             objectListing = ossClient.listObjects(new ListObjectsRequest(SOURCE_BUCKET_NAME).withMarker(nextMarker).withMaxKeys(maxKeys));
  33.             List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
  34.             for (OSSObjectSummary s : sums) {
  35.                 keyList.add(s.getKey());
  36.             }
  37.             nextMarker = objectListing.getNextMarker();
  38.         } while (objectListing.isTruncated());
  39.         // 关闭OSSClient。
  40.         ossClient.shutdown();
  41.         return keyList;
  42.     }
  43.     /**
  44.      * 拷贝文件
  45.      * @param keyList
  46.      */
  47.     public static void copyFiles(List<String> keyList) {
  48.         Long startTime = System.currentTimeMillis();
  49.         // 创建OSSClient实例。
  50.         OSSClient ossClient = new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
  51.         ObjectMetadata meta = new ObjectMetadata();
  52.         meta.setContentType("text/html");
  53.         // 复制文件。
  54.         for (int i = 0; i < keyList.size(); i++) {
  55.             log.info("开始上传:" + keyList.get(i)+" :第"+(i+1)+"个文件");
  56.             // 创建CopyObjectRequest对象。
  57.             CopyObjectRequest copyObjectRequest = new CopyObjectRequest(SOURCE_BUCKET_NAME, keyList.get(i), TARGET_BUCKET_NAME, keyList.get(i));
  58.             // 设置新的文件元信息。
  59.             copyObjectRequest.setNewObjectMetadata(meta);
  60.             ossClient.copyObject(copyObjectRequest);
  61.             log.info("上传成功:" + keyList.get(i)+" :第"+(i+1)+"个文件");
  62.         }
  63.         // 关闭OSSClient。
  64.         ossClient.shutdown();
  65.         Long endTime = System.currentTimeMillis();
  66.         System.out.println("全部上传成功:共"+keyList.size()+"文件。总耗时:" + (endTime - startTime) + "ms");
  67.     }
  68.     public static void main(String args[]) {
  69.         //列举所有文件名
  70.         List<String> keyList = listKeys();
  71.         //循环拷贝文件
  72.         copyFiles(keyList);
  73.     }
  74. }
  官方文档:点此

发表评论

目前评论:2

  • avatar 楚狂人博客

    很有用的知识,感谢分享