作者:无敌小志哥_443 | 来源:互联网 | 2023-09-10 17:10
Upload Part本地上传
我们把本地文件分片上传。假设有一个文件,本地路径为 /path/to/file.zip 由于文件比较大,我们将其分片传输到OSS中。
- using Aliyun.OSS;
- // 初始化OssClient
- var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
- // 计算片个数
- var fi = new FileInfo(fileToUpload);
- var fileSize = fi.Length;
- var partCount = fileSize / partSize;
- if (fileSize % partSize != 0)
- {
- partCount++;
- }
- // 开始分片上传
- try
- {
- var partETags = new List
();
- using (var fs = File.Open(fileToUpload, FileMode.Open))
- {
- for (var i = 0; i
- {
- var skipBytes = (long)partSize * i;
- //定位到本次上传片应该开始的位置
- fs.Seek(skipBytes, 0);
- //计算本次上传的片大小,最后一片为剩余的数据大小,其余片都是part size大小。
- var size = (partSize
- var request = new UploadPartRequest(bucketName, objectName, uploadId)
- {
- InputStream = fs,
- PartSize = size,
- PartNumber = i + 1
- };
- //调用UploadPart接口执行上传功能,返回结果中包含了这个数据片的ETag值
- var result = _ossClient.UploadPart(request);
- partETags.Add(result.PartETag);
- }
- Console.WriteLine("Put multi part upload succeeded");
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine("Put multi part upload failed, {0}", ex.Message);
- }
说明: 完整代码参考
GitHub。
上面程序的核心是调用UploadPart方法来上传每一个分片,但是要注意以下几点:
- UploadPart 方法要求除最后一个Part以外,其他的Part大小都要大于100KB。但是Upload Part接口并不会立即校验上传Part的大小(因为不知道是否为最后一片);只有当Complete Multipart Upload的时候才会校验。
- OSS会将服务器端收到Part数据的MD5值放在ETag头内返回给用户。
- 为了保证数据在网络传输过程中不出现错误,SDK会自动设置Content-MD5,OSS会计算上传数据的MD5值与SDK计算的MD5值比较,如果不一致返回InvalidDigest错误码。
- Part号码的范围是1~10000。如果超出这个范围,OSS将返回InvalidArgument的错误码。
- 每次上传part时都要把流定位到此次上传片开头所对应的位置。
- 每次上传part之后,OSS的返回结果会包含一个 PartETag 对象,他是上传片的ETag与片编号(PartNumber)的组合,在后续完成分片上传的步骤中会用到它,因此我们需要将其保存起来。一般来讲我们将这些 PartETag 对象保存到List中。
完成分片上传
完成分片上传代码如下:
- using Aliyun.OSS;
- // 初始化OssClient
- var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
- try
- {
- var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, key, uploadId);
- foreach (var partETag in partETags)
- {
- completeMultipartUploadRequest.PartETags.Add(partETag);
- }
- var result = client.CompleteMultipartUpload(completeMultipartUploadRequest);
- Console.WriteLine("complete multi part succeeded");
- }
- catch (Exception ex)
- {
- Console.WriteLine("complete multi part failed, {0}", ex.Message);
- }
说明:
- 完整代码参考GitHub。
- 上面代码中的 partETags 就是进行分片上传中保存的partETag的列表,OSS收到用户提交的Part列表后,会逐一验证每个数据Part的有效性。
- 当所有的数据Part验证通过后,OSS会将这些part组合成一个完整的文件。
取消分片上传事件
我们可以用 AbortMultipartUpload 方法取消分片上传。
- using Aliyun.OSS;
- // 初始化OssClient
- var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
- try
- {
- var request = new AbortMultipartUpload(bucketName, key, uploadId);
- client.AbortMultipartUpload(request);
- Console.WriteLine("Abort multi part succeeded");
- }
- catch (Exception ex)
- {
- Console.WriteLine("Abort multi part failed, {0}", ex.Message);
- }
说明: 完整代码参考请
GitHub。