SonnetDB S3 进阶:Multipart、预签名 URL、版本、生命周期与审计
第一篇 S3 对象桶文章讲了上传、下载、列举和删除。这一篇看生产更常用的能力:multipart upload、预签名 URL、版本、生命周期和审计。
Multipart Upload
大文件不适合一次性上传。SonnetDB 提供 multipart 会话:
using System.Text;
using SonnetDB.Data.ObjectStorage;
using var client = new SndbObjectStorageClient(
"Data Source=sonnetdb+http://127.0.0.1:5080/objects;Token=your-token;Timeout=30");
await client.CreateBucketAsync("iotsharp-backups", "database backups");
var upload = await client.InitiateMultipartUploadAsync(
"iotsharp-backups",
"daily/2026-06-14.sndb",
"application/octet-stream");
await using var part1 = new MemoryStream(Encoding.UTF8.GetBytes("hello "));
await client.UploadPartAsync("iotsharp-backups", upload.Key, upload.UploadId, 1, part1);
await using var part2 = new MemoryStream(Encoding.UTF8.GetBytes("world"));
await client.UploadPartAsync("iotsharp-backups", upload.Key, upload.UploadId, 2, part2);
var completed = await client.CompleteMultipartUploadAsync(
"iotsharp-backups",
upload.Key,
upload.UploadId,
[1, 2]);
Console.WriteLine($"{completed.Key} {completed.SizeBytes} bytes");
multipart 的关键是会话 ID 和分片号。服务端会按分片号拼接,并重新计算对象 etag 和 sha256。
预签名 URL
如果前端、设备或客户只需要临时下载对象,不应该把长期 token 暴露出去。可以创建短期预签名 URL:
var url = await client.CreatePresignedUrlAsync(
"iotsharp-backups",
"daily/2026-06-14.sndb",
method: "GET",
expiresMinutes: 10);
Console.WriteLine(url.Url);
预签名 URL 适合下载报表、诊断包、备份包,也适合把附件交给一次性任务处理。
版本和生命周期
对象覆盖写会产生新版本。服务端 API 支持:
GET /v1/db/{db}/s3/{bucket}?versions&key=...
PUT /v1/db/{db}/s3/{bucket}?lifecycle
POST /v1/db/{db}/s3/{bucket}?lifecycle
GET /v1/db/{db}/s3/{bucket}?audit&prefix=...
当前 SndbObjectStorageClient 已覆盖常用对象操作;版本列表、生命周期和审计也可以直接用 HttpClient 调用:
using System.Net.Http.Headers;
using System.Net.Http.Json;
using var http = new HttpClient
{
BaseAddress = new Uri("http://127.0.0.1:5080")
};
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "your-token");
var lifecycle = new
{
expireCurrentAfterDays = 30,
expireNoncurrentAfterDays = 7,
expireDeleteMarkerAfterDays = 3
};
await http.PutAsJsonAsync(
"/v1/db/objects/s3/iotsharp-backups?lifecycle",
lifecycle);
var apply = await http.PostAsync(
"/v1/db/objects/s3/iotsharp-backups?lifecycle",
content: null);
apply.EnsureSuccessStatusCode();
审计为什么重要
对工业平台来说,对象不是普通文件。固件是谁上传的、备份什么时候生成的、诊断包有没有被下载、附件什么时候删除,这些都可能进入交付和合规记录。
SonnetDB 对象桶会记录 bucket 创建、对象写入、复制、标签变更、delete marker、生命周期执行等动作。后续做企业版控制台时,这些审计记录可以直接变成运维页面,而不是散落在 nginx 日志和文件系统里。
官网地址:https://sonnetdb.com
技术文章站:https://iotpaper.net

浙公网安备 33010602011771号