理解:发现阿里云不支持同区域的桶的文件互传,阿里云只支持不同区域的桶文件互传。
同区域,在新加坡创建两个桶,a桶、b桶,想把a桶的文件传到b桶里面以下能实现。
@Slf4j
public class OssCopyBucketUtils {
// Endpoint以北京为例,其它Region请按实际情况填写。
public final static String ENDPOINT = "oss-ap-xxx1.aliyuncs.com";
//accessKey
public final static String ACCESS_KEY_ID = "Lxxxxxd76VoNWkrx";
//accessKey secret
public final static String ACCESS_KEY_SECRET = "w9CNoDJxxxxxxIQNzMs";
//源bucket名a桶
public final static String SOURCE_BUCKET_NAME = "new-a";
//目标bucket名b桶
public final static String TARGET_BUCKET_NAME = "new-b";
/**
* 获得文件列表
* @return
*/
public static List<String> listKeys() {
List<String> keyList = new ArrayList<>();
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
// 设置最大个数。
final int maxKeys = 200;
String nextMarker = null;
ObjectListing objectListing;
do {
objectListing = ossClient.listObjects(new ListObjectsRequest(SOURCE_BUCKET_NAME).withMarker(nextMarker).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
keyList.add(s.getKey());
}
nextMarker = objectListing.getNextMarker();
} while (objectListing.isTruncated());
// 关闭OSSClient。
ossClient.shutdown();
return keyList;
}
/**
* 拷贝文件
* @param keyList
*/
public static void copyFiles(List<String> keyList) {
Long startTime = System.currentTimeMillis();
// 创建OSSClient实例。
OSSClient ossClient = new OSSClient(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("text/html");
// 复制文件。
for (int i = 0; i < keyList.size(); i++) {
Log4jHandel.myinfo("开始上传:" + keyList.get(i)+" :第"+(i+1)+"个文件");
Boolean result=ossClient.doesObjectExist( TARGET_BUCKET_NAME,keyList.get(i));
if(!result){
// 创建CopyObjectRequest对象。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(SOURCE_BUCKET_NAME, keyList.get(i), TARGET_BUCKET_NAME, keyList.get(i));
// 设置新的文件元信息。
copyObjectRequest.setNewObjectMetadata(meta);
ossClient.copyObject(copyObjectRequest);
Log4jHandel.myinfo("上传成功:" + keyList.get(i)+" :第"+(i+1)+"个文件");
}else {
Log4jHandel.myinfo("已存在:" + keyList.get(i)+" :第"+(i+1)+"个文件");
}
}
// 关闭OSSClient。
ossClient.shutdown();
Long endTime = System.currentTimeMillis();
System.out.println("全部上传成功:共"+keyList.size()+"文件。总耗时:" + (endTime - startTime) + "ms");
}
public static void main(String args[]) {
//列举所有文件名
List<String> keyList = listKeys();
//循环拷贝文件
copyFiles(keyList);
}
}