You need to enable JavaScript to run this app.
导航

追加上传(.NET SDK)

最近更新时间2024.02.04 18:31:07

首次发布时间2023.08.24 14:41:47

追加上传指使用 AppendObject 接口在已存在的对象数据末尾追加写入新数据。追加上传创建的对象类型为追加类型(Appendable Object),可在对象末尾追加写入数据。普通上传和分片上传创建的对象类型为普通类型(Normal Object),无法追加写入数据。

注意事项

  • 追加上传前,您需要确保账号拥有 tos:PutObject 权限,具体操作,请参见权限配置指南
  • 上传对象时,对象名称必须满足命名规范,详细信息,请参见对象的命名规范
  • TOS 是面向海量存储设计的分布式对象存储产品,内部分区存储了对象索引数据,为横向扩展您上传对象和下载对象时的最大吞吐量,和减小热点分区的概率,请您避免使用字典序递增的对象命名方式,详细信息,请参见性能优化
  • 如果桶中已经存在同名对象,则新对象会覆盖已有的对象。桶开启多版本的场景下,则会保留原有对象,生成一个新版本号用于标识新上传的对象。
  • 追加上传对象不支持 Chunk-Encoded 的请求方式,当您追加上传网络流时请迭代获取数据再追加上传。

限制说明

使用 AppendObject 接口时,对象的大小限制说明如下:

  • 每次追加的大小不能小于 128KiB,追加后的对象大小不能大于 5GiB。
  • 通过 AppendObject 创建的对象,进行 PutObject 操作,对象被覆盖且对象类型由 Appendable 变为 Normal。反之通过 PutObject 上传的对象不支持追加写操作。
  • AppendObject 创建的对象不支持拷贝。
  • 如果对象类型为低频存储或归档闪回存储,则无法使用 AppendObject 接口。
  • 如果您的存储桶处于开启或暂停多版本控制功能的状态下,则无法使用 AppendObject 接口。

示例代码

以下代码用于先将指定字符流追加上传到指定文件,再将指定路径下的本地文件追加上传到同一个文件。

using System;
using System.IO;
using System.Text;
using TOS;
using TOS.Error;
using TOS.Model;

namespace ConsoleApp
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var ak = Environment.GetEnvironmentVariable("TOS_ACCESS_KEY");
            var sk = Environment.GetEnvironmentVariable("TOS_SECRET_KEY");
            // endpoint 若没有指定HTTP协议(HTTP/HTTPS),默认使用 HTTPS
            // Bucket 的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
            var endpoint = "https://tos-cn-beijing.volces.com";
            var region = "cn-beijing";
            // 填写 BucketName
            var bucketName = "*** Provide your bucket name ***";
            // 上传对象 Body,以 string 对象为例
            var objectContent = "your append object value";
            // 将文件上传到 example_dir 目录下的 example.txt 文件
            var objectKey = "example_dir/example.txt";
            // 需要上传的本地文件
            var localFileName = "/usr/local/test.txt";

            // 创建TOSClient实例
            var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build();

            try
            {
                var binaryData = Encoding.UTF8.GetBytes(objectContent);
                AppendObjectOutput appendObjectOutput;

                // 通过字符串追加上传对象
                using (var requestContent = new MemoryStream(binaryData))
                {
                    // 创建追加上传文件输入
                    var appendObjectInput = new AppendObjectInput
                    {
                        Bucket = bucketName,
                        Key = objectKey,
                        Content = requestContent
                    };

                    // 上传字符流
                    appendObjectOutput = client.AppendObject(appendObjectInput);
                    Console.WriteLine("Append object succeeded, request id: {0} ", appendObjectOutput.RequestID);
                }

                // 从文件流中获取数据
                using (var fileStream = File.OpenRead(localFileName))
                {
                    // 创建追加上传文件输入
                    var appendObjectInput = new AppendObjectInput
                    {
                        Bucket = bucketName,
                        Key = objectKey,
                        // 指定下次 append offset
                        Offset = appendObjectOutput.NextAppendOffset,
                        Content = fileStream
                    };

                    // 上传文件流
                    appendObjectOutput = client.AppendObject(appendObjectInput);
                    Console.WriteLine("Append object succeeded, request id: {0} ", appendObjectOutput.RequestID);
                }
            }
            catch (TosServerException ex)
            {
                Console.WriteLine("Put object failed, request id {0}", ex.RequestID);
                Console.WriteLine("Put object failed, status code {0}", ex.StatusCode);
                Console.WriteLine("Put object failed, response error code {0}", ex.Code);
                Console.WriteLine("Put object failed, response error message {0}", ex.Message);
            }
            catch (TosClientException ex)
            {
                Console.WriteLine("Put object failed, error message {0}", ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Put object failed, {0}", ex.Message);
            }
        }
    }
}