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

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

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