You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Backblaze B2(S3兼容API)实现存储桶上传大小限制?

实现Backblaze B2存储桶的订阅容量限制方案

由于Backblaze B2本身不支持直接设置存储桶配额,也没有原生API返回桶的总占用大小,因此需要从应用层管控入手,结合B2的特性和你使用的@aws-sdk/client-s3工具实现限制,以下是具体可行方案:

方案一:本地计量+上传前校验(推荐)

核心逻辑是在应用内维护每个工作区的已用存储量,上传前先做配额校验,避免无效上传操作。

  • 维护存储用量记录
    在你的业务数据库(如PostgreSQL、MongoDB)中为每个工作区添加used_storage字段,初始值设为0。每次执行上传/删除文件操作时,同步更新该数值:

    • 上传文件:获取文件大小后,用数据库原子操作(如PostgreSQL的UPDATE ... SET used_storage = used_storage + $1 WHERE ...)累加用量
    • 删除文件:删除时读取文件大小,同样用原子操作扣除对应用量
      原子操作可避免并发场景下的数据不一致问题。
  • 上传前配额校验
    用户发起上传请求时,先查询该工作区的used_storage,加上当前文件大小后若超出订阅配额,直接在应用层拒绝请求,无需调用B2的API。

  • 定期校准用量
    为避免应用层记录与B2实际存储量出现偏差(如直接通过B2控制台修改文件、应用异常导致记录未更新),可定期(如每日凌晨)通过API遍历桶内所有文件,计算总大小并同步到数据库:

    const { S3Client, ListObjectsV2Command } = require("@aws-sdk/client-s3");
    const client = new S3Client({
      endpoint: "https://s3.<your-region>.backblazeb2.com",
      credentials: {
        accessKeyId: "YOUR_KEY_ID",
        secretAccessKey: "YOUR_APP_KEY"
      }
    });
    
    async function calculateBucketTotalSize(bucketName) {
      let totalSize = 0;
      let continuationToken = null;
      do {
        const command = new ListObjectsV2Command({
          Bucket: bucketName,
          ContinuationToken: continuationToken
        });
        const response = await client.send(command);
        response.Contents?.forEach(obj => {
          totalSize += obj.Size;
        });
        continuationToken = response.NextContinuationToken;
      } while (continuationToken);
      return totalSize;
    }
    

方案二:B2生命周期规则+告警(兜底管控)

若担心应用层校验被绕过(如用户直接使用B2密钥上传),可结合B2的生命周期规则和告警机制做兜底:

  • 动态设置生命周期规则
    当检测到工作区超出配额时,调用B2 API为对应存储桶添加生命周期规则,匹配所有新上传的文件并立即删除;待用户清理空间或升级订阅后,再移除该规则。

  • 配置存储用量告警
    在Backblaze控制台为每个桶设置存储用量告警,当用量达到配额的90%时,触发通知到你的应用,由应用向用户发送升级或清理空间的提醒。

方案三:改用文件夹隔离(替代独立桶)

如果每个工作区用独立桶的管理成本过高,可改为在同一个桶下用不同文件夹(前缀)隔离不同工作区。计量时通过ListObjectsV2Command的Prefix参数,仅遍历目标工作区的文件计算总大小,逻辑与方案一一致,但能减少桶的数量,降低管理复杂度。

注意事项

  • 分片上传处理:若支持大文件分片上传,需确保每个分片的大小都计入used_storage,或在分片合并完成后一次性更新总用量。
  • 权限管控:严格禁止用户直接获取B2密钥,所有存储操作必须通过你的应用接口发起,避免绕过应用层校验。
  • 单位转换:注意配额单位(如GB)与文件大小单位(字节)的转换,避免计算错误。

内容的提问来源于stack exchange,提问作者Mohammad Riyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:55:06