上传回调是指客户端在请求时携带回调(Callback)参数,服务端在上传完成后,发送同步的 POST 回调请求到 CallBack 中指定的第三方应用服务器,在服务器确认接受并返回结果后,才将所有结果返回给客户端。
关于上传回调的详细介绍,请参见上传回调。
using System;
using System.IO;
using System.Text;
using TOS;
using TOS.Error;
using TOS.Model;
namespace TestTos
{
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 = "Hello TOS";
// 将文件上传到 example_dir 目录下的 example.txt 文件
var objectKey = "example_dir/example.txt";
// 上传回调参数
var callback = "your callback param";
// 上传回调自定义变量
var callbackVar = "your callback custom variable";
// 创建TOSClient实例
var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build();
try
{
byte[] binaryData = Encoding.UTF8.GetBytes(objectContent);
using (MemoryStream requestContent = new MemoryStream(binaryData))
{
// 创建上传文件输入
var putObjectInput = new PutObjectInput()
{
Bucket = bucketName,
Key = objectKey,
Content = requestContent,
Callback = Convert.ToBase64String(Encoding.UTF8.GetBytes(callback)),
CallbackVar = Convert.ToBase64String(Encoding.UTF8.GetBytes(callbackVar))
};
// 将字符串 “Hello TOS” 上传到指定 example_dir 目录下的 example.txt
var putObjectOutput = client.PutObject(putObjectInput);
Console.WriteLine("Put object succeeded, ETag: {0} ", putObjectOutput.ETag);
Console.WriteLine("Put object succeeded, CallbackResult: {0} ", putObjectOutput.CallbackResult);
}
}
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);
}
}
}
}
using System;
using System.Collections.Generic;
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 ***";
// 将文件上传到 example_dir 目录下的 example.txt 文件
var objectKey = "example_dir/example.txt";
// 需要上传的本地文件
var localFileName = "/usr/local/test.txt";
// 上传回调参数
var callback = "your callback param";
// 上传回调自定义变量
var callbackVar = "your callback custom variable";
// 创建TOSClient实例
var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build();
// 初始化分片,指定对象权限为私有,存储类型为低频并设置元数据信息
var uploadID = "";
try
{
var createMultipartUploadInput = new CreateMultipartUploadInput
{
Bucket = bucketName,
Key = objectKey,
ACL = ACLType.ACLPrivate,
StorageClass = StorageClassType.StorageClassIa,
Meta = new Dictionary<string, string> { { "key", "value" } }
};
var createMultipartUploadOutput = client.CreateMultipartUpload(createMultipartUploadInput);
uploadID = createMultipartUploadOutput.UploadID;
Console.WriteLine("CreateMultipartUpload succeeded, request id {0}",
createMultipartUploadOutput.RequestID);
Console.WriteLine("CreateMultipartUpload succeeded, upload id {0}", uploadID);
}
catch (TosServerException ex)
{
Console.WriteLine("CreateMultipartUpload failed, request id {0}", ex.RequestID);
Console.WriteLine("CreateMultipartUpload failed, status code {0}", ex.StatusCode);
Console.WriteLine("CreateMultipartUpload failed, response error code {0}", ex.Code);
Console.WriteLine("CreateMultipartUpload failed, response error message {0}", ex.Message);
}
catch (TosClientException ex)
{
Console.WriteLine("CreateMultipartUpload failed, error message {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("CreateMultipartUpload failed, {0}", ex.Message);
}
// part size 大小设置为 20M
long partSize = 20 * 1024 * 1024;
// 计算分片信息
var fi = new FileInfo(localFileName);
var fileSize = fi.Length;
var partCount = fileSize / partSize;
if (fileSize % partSize != 0) partCount++;
var parts = new UploadedPart[partCount];
// 开始分片上传
try
{
using (var fileStream = File.Open(localFileName, FileMode.Open, FileAccess.Read))
{
for (var i = 0; i < partCount; i++)
{
var offset = partSize * i;
// 定位到本次上传的起始位置。
fileStream.Seek(offset, 0);
// 计算本次上传的分片大小,最后一片为剩余的数据大小。
var contentSize = partSize < fileSize - offset ? partSize : fileSize - offset;
var UploadPartInput = new UploadPartInput
{
Bucket = bucketName,
Key = objectKey,
UploadID = uploadID,
// partNumber 编号从 1 开始
PartNumber = i + 1,
Content = fileStream,
ContentLength = contentSize
};
var uploadPartOutput = client.UploadPart(UploadPartInput);
parts[i] = new UploadedPart { PartNumber = i + 1, ETag = uploadPartOutput.ETag };
Console.WriteLine("UploadPart succeeded, request id {0}", uploadPartOutput.RequestID);
}
}
}
catch (TosServerException ex)
{
Console.WriteLine("UploadPart failed, request id {0}", ex.RequestID);
Console.WriteLine("UploadPart failed, status code {0}", ex.StatusCode);
Console.WriteLine("UploadPart failed, response error code {0}", ex.Code);
Console.WriteLine("UploadPart failed, response error message {0}", ex.Message);
}
catch (TosClientException ex)
{
Console.WriteLine("UploadPart failed, error message {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("UploadPart failed, {0}", ex.Message);
}
// 合并分片
try
{
var completeMultipartUploadInput = new CompleteMultipartUploadInput
{
Bucket = bucketName,
Key = objectKey,
UploadID = uploadID,
Parts = parts,
Callback = Convert.ToBase64String(Encoding.UTF8.GetBytes(callback)),
CallbackVar = Convert.ToBase64String(Encoding.UTF8.GetBytes(callbackVar))
};
var completeMultipartUploadOutput = client.CompleteMultipartUpload(completeMultipartUploadInput);
Console.WriteLine("CompleteMultipartUpload succeeded, request id {0}", completeMultipartUploadOutput.RequestID);
Console.WriteLine("CompleteMultipartUpload succeeded, callback result {0}", completeMultipartUploadOutput.CallbackResult);
}
catch (TosServerException ex)
{
Console.WriteLine("CompleteMultipartUpload failed, request id {0}", ex.RequestID);
Console.WriteLine("CompleteMultipartUpload failed, status code {0}", ex.StatusCode);
Console.WriteLine("CompleteMultipartUpload failed, response error code {0}", ex.Code);
Console.WriteLine("CompleteMultipartUpload failed, response error message {0}", ex.Message);
}
catch (TosClientException ex)
{
Console.WriteLine("CompleteMultipartUpload failed, error message {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("CompleteMultipartUpload failed, {0}", ex.Message);
}
}
}
}