追加上传
追加写的方式上传文件。详细介绍请参考
API。
- using Aliyun.OSS;
- // 初始化OssClient
- var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
- /// <summary>
- /// 追加内容到指定的OSS文件中。
- /// </summary>
- /// <param name="bucketName">指定的存储空间名称。</param>
- /// <param name="key">OSS上会被追加内容的文件名称。</param>
- /// <param name="fileToUpload">指定被追加的文件的路径。</param>
- public static void AppendObject(string bucketName, string key, string fileToUpload)
- {
- //第一次追加文件的时候,文件可能已经存在,先获取文件的当前长度,如果不存在,position为0
- long position = 0;
- try
- {
- var metadata = client.GetObjectMetadata(bucketName, key);
- position = metadata.ContentLength;
- }
- catch(Exception) {}
- try
- {
- using (var fs = File.Open(fileToUpload, FileMode.Open))
- {
- var request = new AppendObjectRequest(bucketName, key)
- {
- ObjectMetadata = new ObjectMetadata(),
- Content = fs,
- Position = position
- };
- var result = client.AppendObject(request);
- // 设置下次追加文件时的position位置
- position = result.NextAppendPosition;
- Console.WriteLine("Append object succeeded, next append position:{0}", position);
- }
- // 再次追加文件,这时候的position值可以从上次的结果中获取到
- using (var fs = File.Open(fileToUpload, FileMode.Open))
- {
- var request = new AppendObjectRequest(bucketName, key)
- {
- ObjectMetadata = new ObjectMetadata(),
- Content = fs,
- Position = position
- };
- var result = client.AppendObject(request);
- position = result.NextAppendPosition;
- Console.WriteLine("Append object succeeded, next append position:{0}", position);
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine("Append object failed, {0}", ex.Message);
- }
- }
说明:
分片上传
除了通过PutObject接口上传文件到OSS以外,OSS还提供了另外一种上传模式 —— Multipart Upload。
用户可以在如下的应用场景内(但不仅限于此),使用Multipart Upload上传模式,如:
- 需要支持断点上传。
- 上传超过100MB大小的文件。
- 网络条件较差,和OSS的服务器之间的链接经常断开。
- 上传文件之前,无法确定上传文件的大小。
下面我们将一步步学习怎样实现Multipart Upload。
分步完成Multipart Upload
初始化Multipart Upload
我们使用 initiateMultipartUpload 方法来初始化一个分片上传事件:
- using Aliyun.OSS;
- // 初始化OssClient
- var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
- try
- {
- string bucketName = "your-bucket-name";
- string key = "your-key";
- // 开始Multipart Upload
- var request = new InitiateMultipartUploadRequest(bucketName, key);
- var result = client.InitiateMultipartUpload(request);
- // 打印UploadId
- Console.WriteLine("Init multi part upload succeeded");
- Console.WriteLine("Upload Id:{0}", result.UploadId);
- }
- catch (Exception ex)
- {
- Console.WriteLine("Init multi part upload failed, {0}", ex.Message);
- }
说明:
- 完整代码参考GitHub。
- 我们用InitiateMultipartUploadRequest来指定上传文件的名字和所属存储空间(Bucket)。
- 在InitiateMultipartUploadRequest中,您也可以设置ObjectMeta,但是不必指定其中的ContentLength。
- initiateMultipartUpload 的返回结果中含有UploadId ,它是区分分片上传事件的唯一标识,在后面的操作中,我们将用到它。