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

Backblaze CORS在localhost环境下无法正常工作的问题求助

Backblaze B2 前端上传跨域问题排查与解决

操作背景

参照相关指导配置Backblaze B2存储桶CORS规则后,前端分别使用S3Client和backblaze-b2包尝试文件上传,均触发跨域错误。


已配置的CORS规则

rules.json配置内容

[
    {
        "corsRuleName": "downloadFromAnyOriginWithUpload",
        "allowedOrigins": ["*"],
        "allowedHeaders": [
            "authorization",
            "content-type",
            "x-bz-file-name",
            "x-bz-content-sha1"
        ],
        "allowedOperations": [
            "b2_download_file_by_id",
            "b2_download_file_by_name",
            "b2_upload_file",
            "b2_upload_part"
        ],
        "maxAgeSeconds": 3600
    }
]

规则更新结果验证

执行命令 ./b2-windows.exe update-bucket --cors-rules "$(cat rules.json)" private-bucket2 后,返回结果显示规则已正确生效:

{
    "accountId": "5c83d2c9fb2a",
    "bucketId": "d51c58c36d022cb98ffb021a",
    "bucketInfo": {},
    "bucketName": "private-bucket2",
    "bucketType": "allPrivate",
    "corsRules": [
        {
            "allowedHeaders": [
                "authorization",
                "content-type",
                "x-bz-file-name",
                "x-bz-content-sha1"
            ],
            "allowedOperations": [
                "b2_download_file_by_id",
                "b2_upload_part",
                "b2_upload_file",
                "b2_download_file_by_name"
            ],
            "allowedOrigins": ["*"],
            "corsRuleName": "downloadFromAnyOriginWithUpload",
            "exposeHeaders": null,
            "maxAgeSeconds": 3600
        }
    ],
    "defaultRetention": {"mode": null},
    "defaultServerSideEncryption": {"mode": "none"},
    "isFileLockEnabled": false,
    "lifecycleRules": [],
    "options": ["s3"],
    "replication": {
        "asReplicationDestination": null,
        "asReplicationSource": null
    },
    "revision": 16
}

前端代码尝试及错误情况

1. 使用AWS S3Client上传

// 前端执行代码
const s3 = new S3Client({
    endpoint: 'https://s3.us-east-005.backblazeb2.com',
    region: 'us-east-005',
    credentials: {
        accessKeyId: "5c83d2c9fb2a",
        secretAccessKey: "0058d9a7de2103531f2f28e402f4bd5e7ad68d054c"
    }
});

const x = await s3.send(new PutObjectCommand({
    Bucket: "private-bucket2",
    Key: "my-filename.jpg",
    Body: blob
}));

触发跨域错误:
S3Client跨域错误截图

2. 使用backblaze-b2包尝试

// 前端执行代码
import B2 from "backblaze-b2";
const b2 = new B2({
    applicationKeyId: '5c83d2c9fb2a',
    applicationKey: '0058d9a7de2103531f2f28e402f4bd5e7ad68d054c'
});
await b2.authorize();

同样触发跨域错误:
backblaze-b2包跨域错误截图

相关请求截图

  • 实际请求:实际请求截图
  • 预检请求:预检请求截图

问题分析与解决办法

1. 补充CORS规则中的请求头

从预检请求截图可见,浏览器发起的OPTIONS请求包含x-amz-content-sha256、x-amz-date等额外请求头,当前规则未允许这些头,需更新allowedHeaders:

"allowedHeaders": [
    "authorization",
    "content-type",
    "x-bz-file-name",
    "x-bz-content-sha1",
    "x-amz-content-sha256",
    "x-amz-date",
    "x-amz-security-token"
]

测试环境可直接用"*"允许所有请求头,生产环境需按需配置。

2. 采用安全的上传流程(避免前端暴露密钥)

前端硬编码账号密钥存在严重安全风险,正确流程为:

  • 后端调用b2_get_upload_url和b2_get_upload_part_url获取上传地址与授权令牌
  • 将地址和令牌返回给前端,前端直接向该地址发起PUT请求上传文件,无需携带账号密钥

3. 确认S3兼容模式的Endpoint格式

使用S3Client时,需使用存储桶专属Endpoint:https://private-bucket2.s3.us-east-005.backblazeb2.com,而非全局Endpoint。

4. 清除浏览器缓存

浏览器可能缓存旧的CORS规则,更新后需清除缓存或使用无痕模式测试。


内容的提问来源于stack exchange,提问作者Sebastian Nielsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:00:27