本文介绍如何拷贝文件。
拷贝小文件
拷贝小文件的完整代码请参见 GitHub。此操作的限制条件如下:
- 用户有源文件的读写权限。
- 不支持跨地域拷贝。例如,不支持将杭州存储空间里的文件拷贝到青岛。
- 文件的大小不能超过1GB。
以下代码用于拷贝小文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | using Aliyun.OSS; using Aliyun.OSS.Common; var endpoint = "<yourEndpoint>" ; var accessKeyId = "<yourAccessKeyId>" ; var accessKeySecret = "<yourAccessKeySecret>" ; var sourceBucket = "<yourSourceBucketName>" ; var sourceObject = "<yourSourceObjectName>" ; var targetBucket = "<yourDestBucketName>" ; var targetObject = "<yourDestObjectName>" ; // 创建OssClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { var metadata = new ObjectMetadata(); metadata.AddHeader( "mk1" , "mv1" ); metadata.AddHeader( "mk2" , "mv2" ); var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject) { // 如果NewObjectMetadata为null则为COPY模式(即拷贝源文件的元信息),非null则为REPLACE模式(覆盖源文件的元信息)。 NewObjectMetadata = metadata }; // 拷贝文件。 client.CopyObject(req); Console.WriteLine( "Copy object succeeded" ); } catch (OssException ex) { Console.WriteLine( "Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}" , ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine( "Failed with error info: {0}" , ex.Message); } |
拷贝大文件
拷贝大文件完整代码请参见GitHub。
- 分片拷贝
对于大于1GB的文件,建议使用分片拷贝,步骤如下:
- 使用 InitiateMultipartUploadRequest 方法来初始化一个分片上传事件。
- 使用 UploadPartCopy 方法进行分片拷贝。
- 使用 CompleteMultipartUpload 方法完成文件拷贝。
以下代码用于分片拷贝文件:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667using Aliyun.OSS;
var endpoint =
"<yourEndpoint>"
;
var accessKeyId =
"<yourAccessKeyId>"
;
var accessKeySecret =
"<yourAccessKeySecret>"
;
var sourceBucket =
"<yourSourceBucketName>"
;
var sourceObject =
"<yourSourceObjectName>"
;
var targetBucket =
"<yourDestBucketName>"
;
var targetObject =
"<yourDestObjectName>"
;
var uploadId =
""
;
var partSize =
50
*
1024
*
1024
;
// 创建OssClient实例。
var client =
new
OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 初始化拷贝任务。可以通过InitiateMultipartUploadRequest指定目标文件元信息。
var request =
new
InitiateMultipartUploadRequest(targetBucket, targetObject);
var result = client.InitiateMultipartUpload(request);
// 打印uploadId。
uploadId = result.UploadId;
Console.WriteLine(
"Init multipart upload succeeded, Upload Id: {0}"
, result.UploadId);
// 计算分片数。
var metadata = client.GetObjectMetadata(sourceBucket, sourceObject);
var fileSize = metadata.ContentLength;
var partCount = (
int
)fileSize / partSize;
if
(fileSize % partSize !=
0
)
{
partCount++;
}
// 开始分片拷贝。
var partETags =
new
List<PartETag>();
for
(var i =
0
; i < partCount; i++)
{
var skipBytes = (
long
)partSize * i;
var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
// 创建UploadPartCopyRequest。可以通过UploadPartCopyRequest指定限定条件。
var uploadPartCopyRequest =
new
UploadPartCopyRequest(targetBucket, targetObject, sourceBucket, sourceObject, uploadId)
{
PartSize = size,
PartNumber = i +
1
,
// BeginIndex用来定位此次上传分片开始所对应的位置。
BeginIndex = skipBytes
};
// 调用uploadPartCopy方法来拷贝每一个分片。
var uploadPartCopyResult = client.UploadPartCopy(uploadPartCopyRequest);
Console.WriteLine(
"UploadPartCopy : {0}"
, i);
partETags.Add(uploadPartCopyResult.PartETag);
}
// 完成分片拷贝。
var completeMultipartUploadRequest =
new
CompleteMultipartUploadRequest(targetBucket, targetObject, uploadId);
// partETags为分片上传中保存的partETag的列表,OSS收到用户提交的此列表后,会逐一验证每个数据分片的有效性。全部验证通过后,OSS会将这些分片合成一个完整的文件。
foreach (var partETag in partETags)
{
completeMultipartUploadRequest.PartETags.Add(partETag);
}
var completeMultipartUploadResult = client.CompleteMultipartUpload(completeMultipartUploadRequest);
Console.WriteLine(
"CompleteMultipartUpload succeeded"
);
}
catch
(OssException ex)
{
Console.WriteLine(
"Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}"
,
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch
(Exception ex)
{
Console.WriteLine(
"Failed with error info: {0}"
, ex.Message);
}
- 断点续传拷贝
如果拷贝中断,可通过断点续传继续拷贝。 断点续传拷贝的完整代码请参见GitHub。
以下代码用于断点续传拷贝:
12345678910111213141516171819202122using Aliyun.OSS;
var endpoint =
"<yourEndpoint>"
;
var accessKeyId =
"<yourAccessKeyId>"
;
var accessKeySecret =
"<yourAccessKeySecret>"
;
var sourceBucket =
"<yourSourceBucketName>"
;
var sourceObject =
"<yourSourceObjectName>"
;
var targetBucket =
"<yourDestBucketName>"
;
var targetObject =
"<yourDestObjectName>"
;
var checkpointDir = @
"<yourCheckpointDir>"
;
// 创建OssClient实例。
var client =
new
OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
var request =
new
CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject);
// checkpointDir目录中会保存断点续传的中间状态,用于失败后,下次继续拷贝。如果checkpointDir为null,断点续传功能不会生效,每次都会重新拷贝。
client.ResumableCopyObject(request, checkpointDir);
Console.WriteLine(
"Resumable copy new object:{0} succeeded"
, request.DestinationKey);
}
catch
(Exception ex)
{
Console.WriteLine(
"Resumable copy new object failed, {0}"
, ex.Message);
}