全部产品
阿里云办公

拷贝文件

更新时间:2018-07-02 15:18:18

拷贝小文件

对于小于1GB的文件,您可以通过ossClient.copyObject方法将文件从一个存储空间(源存储空间)复制到同一地域的另一个存储空间(目标存储空间)。此方法有两种参数指定方式:

参数指定方式 描述
CopyObjectResult copyObject(String sourceBucketName, String sourceKey, String destinationBucketName, String destinationKey) 允许指定源存储空间和源文件,以及目标存储空间和目标文件。拷贝后,目标文件的内容及元信息与源文件相同,称为简单拷贝。
CopyObjectResult copyObject(CopyObjectRequest copyObjectRequest) 允许指定目标文件的元信息和拷贝的限制条件。如果拷贝操作的源文件地址和目标文件地址相同,则直接替换源文件的元信息。

CopyObjectRequest可设置的参数如下:

参数 描述 方法
sourceBucketName 源存储空间名称。 setSourceBucketName(String sourceBucketName)
sourceKey 源文件名称。 setSourceKey(String sourceKey)
destinationBucketName 目标存储空间名称。 setDestinationBucketName(String destinationBucketName)
destinationKey 目标文件名称。 setDestinationKey(String destinationKey)
newObjectMetadata 目标文件元信息。 setNewObjectMetadata(ObjectMetadata newObjectMetadata)
matchingETagConstraints 拷贝的限制条件。如果源文件的ETag值和提供的ETag值相等,则执行拷贝操作,否则返回错误。 setMatchingETagConstraints(List<String> matchingETagConstraints)
nonmatchingEtagConstraints 拷贝的限制条件。如果源文件的ETag值和用户提供的ETag值不相等,则执行拷贝操作,否则返回错误。 setNonmatchingETagConstraints(List<String> nonmatchingEtagConstraints)
unmodifiedSinceConstraint 拷贝的限制条件。如果传入参数中的时间等于或者晚于文件实际修改时间,则执行拷贝操作,否则返回错误。 setUnmodifiedSinceConstraint(Date unmodifiedSinceConstraint)
modifiedSinceConstraint 拷贝的限制条件。如果源文件在指定的时间之后被修改过,则执行拷贝操作,否则返回错误。 setModifiedSinceConstraint(Date modifiedSinceConstraint)

CopyObjectRequest的参数如下:

参数 描述 方法
etag OSS文件唯一性标志 String getETag()
lastModified 文件最后修改时间 Date getLastModified()

此操作的限制条件如下:

  • 用户有源文件的读写权限。
  • 不支持跨地域拷贝。例如,不支持将杭州存储空间里的文件拷贝到青岛。
  • 文件的大小不能超过1GB。

简单拷贝

以下代码用于简单拷贝:

  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String sourceBucketName = "<yourSourceBucketName>";
  7. String sourceObjectName = "<yourSourceObjectName>";
  8. String destinationBucketName = "<yourDestinationBucketName>";
  9. String destinationObjectName = "<yourDestinationObjectName>";
  10. // 创建OSSClient实例。
  11. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  12. // 拷贝文件。
  13. CopyObjectResult result = ossClient.copyObject(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
  14. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
  15. // 关闭OSSClient。
  16. ossClient.shutdown();

通过CopyObjectRequest拷贝

以下代码用于通过CopyObjectRequest拷贝文件:

  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String sourceBucketName = "<yourSourceBucketName>";
  7. String sourceObjectName = "<yourSourceObjectName>";
  8. String destinationBucketName = "<yourDestinationBucketName>";
  9. String destinationObjectName = "<yourDestinationObjectName>";
  10. // 创建OSSClient实例。
  11. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  12. // 创建CopyObjectRequest对象。
  13. CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
  14. // 设置新的文件元信息。
  15. ObjectMetadata meta = new ObjectMetadata();
  16. meta.setContentType("text/html");
  17. copyObjectRequest.setNewObjectMetadata(meta);
  18. // 复制文件。
  19. CopyObjectResult result = ossClient.copyObject(copyObjectRequest);
  20. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
  21. // 关闭OSSClient。
  22. ossClient.shutdown();

拷贝大文件

对于大于1GB的文件,需要使用分片拷贝(UploadPartCopy)。分片拷贝分为三步:

  1. 通过ossClient.initiateMultipartUpload初始化分片拷贝任务。
  2. 通过ossClient.uploadPartCopy进行分片拷贝。除最后一个分片外,其它分片都要大于100KB。
  3. 通过ossClient.completeMultipartUpload提交分片拷贝任务。
  1. // Endpoint以杭州为例,其它Region请按实际情况填写。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String sourceBucketName = "<yourSourceBucketName>";
  7. String sourceObjectName = "<yourSourceObjectName>";
  8. String destinationBucketName = "<yourDestinationBucketName>";
  9. String destinationObjectName = "<yourDestinationObjectName>";
  10. ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceObjectName);
  11. // 获取被拷贝文件的大小。
  12. long contentLength = objectMetadata.getContentLength();
  13. // 设置分片大小为10MB。
  14. long partSize = 1024 * 1024 * 10;
  15. // 计算分片总数。
  16. int partCount = (int) (contentLength / partSize);
  17. if (contentLength % partSize != 0) {
  18. partCount++;
  19. }
  20. System.out.println("total part count:" + partCount);
  21. // 初始化拷贝任务。可以通过InitiateMultipartUploadRequest指定目标文件元信息。
  22. InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(destinationBucketName, destinationObjectName);
  23. InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);
  24. String uploadId = initiateMultipartUploadResult.getUploadId();
  25. // 分片拷贝。
  26. List<PartETag> partETags = new ArrayList<PartETag>();
  27. for (int i = 0; i < partCount; i++) {
  28. // 计算每个分片的大小。
  29. long skipBytes = partSize * i;
  30. long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes;
  31. // 创建UploadPartCopyRequest。可以通过UploadPartCopyRequest指定限定条件。
  32. UploadPartCopyRequest uploadPartCopyRequest =
  33. new UploadPartCopyRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
  34. uploadPartCopyRequest.setUploadId(uploadId);
  35. uploadPartCopyRequest.setPartSize(size);
  36. uploadPartCopyRequest.setBeginIndex(skipBytes);
  37. uploadPartCopyRequest.setPartNumber(i + 1);
  38. UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest);
  39. // 将返回的分片ETag保存到partETags中。
  40. partETags.add(uploadPartCopyResult.getPartETag());
  41. }
  42. // 提交分片拷贝任务。
  43. CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
  44. destinationBucketName, destinationObjectName, uploadId, partETags);
  45. ossClient.completeMultipartUpload(completeMultipartUploadRequest);
  46. // 关闭OSSClient。
  47. ossClient.shutdown();

分片拷贝的详细说明请参见UploadPartCopy。分片拷贝的完整代码请参见GitHub