SonnetDB S3 对象桶:用 C# 上传、下载、Range Read 与删除对象
工业平台除了时序数据,还会有大量对象:固件包、设备照片、巡检附件、报表、诊断包、备份文件。SonnetDB 最近补齐了 S3-compatible 对象桶能力,让这些对象可以和数据库元数据、审计、生命周期一起托管。
C# 客户端入口是 SndbObjectStorageClient。
using System.Text;
using SonnetDB.Data.ObjectStorage;
var connectionString =
"Data Source=sonnetdb+http://127.0.0.1:5080/objects;" +
"Token=your-admin-or-write-token;" +
"Timeout=30";
using var client = new SndbObjectStorageClient(connectionString);
await client.CreateBucketAsync("iotsharp-artifacts", "firmware and attachments");
await using var payload = new MemoryStream(Encoding.UTF8.GetBytes("firmware payload"));
var written = await client.PutObjectAsync(
bucket: "iotsharp-artifacts",
key: "firmware/pump/v1.bin",
content: payload,
contentType: "application/octet-stream",
metadata: new Dictionary<string, string>
{
["owner"] = "iotsharp",
["deviceModel"] = "pump"
},
tags: new Dictionary<string, string>
{
["kind"] = "firmware",
["env"] = "test"
});
Console.WriteLine($"etag={written.ETag}, sha256={written.Sha256}");
远程路径对应的 HTTP API 是:
PUT /v1/db/{db}/s3/{bucket}
PUT /v1/db/{db}/s3/{bucket}/{key}
GET /v1/db/{db}/s3/{bucket}?list-type=2&prefix=...
GET /v1/db/{db}/s3/{bucket}/{key}
DELETE /v1/db/{db}/s3/{bucket}/{key}
列举和读取
var list = await client.ListObjectsAsync("iotsharp-artifacts", "firmware/");
foreach (var item in list.Objects)
{
Console.WriteLine($"{item.Key} {item.SizeBytes} {item.ContentType}");
}
var read = await client.OpenReadAsync("iotsharp-artifacts", "firmware/pump/v1.bin");
if (read is not null)
{
await using var stream = read.Content;
using var reader = new StreamReader(stream, Encoding.UTF8);
Console.WriteLine(await reader.ReadToEndAsync());
}
Range Read
大对象经常需要分段读取,比如断点续传或只读取文件头:
using SonnetDB.ObjectStorage;
var range = await client.OpenReadAsync(
"iotsharp-artifacts",
"firmware/pump/v1.bin",
new SndbObjectRange(offset: 0, length: 128));
服务端会返回 HTTP 206 Partial Content,并带上对应的 content range。
删除不是简单抹掉
SonnetDB 对象桶支持 delete marker。删除对象后,当前可见版本会变成删除标记,历史版本仍可用于审计、生命周期和恢复策略。
await client.DeleteObjectAsync("iotsharp-artifacts", "firmware/pump/v1.bin");
对 IoTSharp 这类平台来说,对象桶的价值不是“又写了一个网盘”,而是把附件、固件、备份包放进可审计、可迁移、可和数据库生命周期一起管理的底座。
官网地址:https://sonnetdb.com
技术文章站:https://iotpaper.net

浙公网安备 33010602011771号