阿里云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. }

 

官方文档:点此

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
言曌

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • avatar 楚狂人博客

      很有用的知识,感谢分享