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 和分片号。服务端会按分片号拼接,并重新计算对象 etagsha256

预签名 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

开源仓库:https://github.com/IoTSharp/SonnetDB

posted @ 2026-06-14 23:04  IoTSharp  阅读(7)  评论(0)    收藏  举报