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

Firebase Storage配置文件大小限制规则上传文件报权限拒绝错误

问题根因

权限拒绝和规则本身的逻辑写法无关,核心是React Native/Expo 环境下通过XMLHttpRequest获取的Blob对象,不符合Firebase Web SDK对Blob的属性读取预期:

  • 浏览器环境的Blob是原生实现,自带标准的size、type属性,Firebase SDK上传前会自动读取这两个值填充到上传请求的标准元数据中,服务端规则里的大小校验可以正常读取到request.resource.size的值
  • Expo/RN环境的XMLHttpRequest返回的Blob是社区polyfill实现,Firebase SDK无法自动识别读取它的size属性,导致规则校验阶段request.resource.size值为undefined,undefined < 99 * 1024 * 1024的判断结果为false,直接触发权限拒绝
  • 你之前尝试传自定义metadata的方案无效,是因为request.resource.size是Storage服务端从上传请求的标准文件元数据字段读取的,和自定义的customMetadata是完全独立的两个字段,修改customMetadata的校验规则自然不会生效
  • 你之前把规则临时改成allow read, write: if true可以正常上传,恰好能印证这个根因:全量放开规则后服务端不再校验request.resource.size字段,哪怕SDK没传正确的size值也不会触发拒绝。
修复方案

方案1:上传时显式传入标准元数据(最小改动)

不用修改现有获取Blob的逻辑,调用uploadBytes的时候显式把Blob的size、type填到标准元数据字段里,SDK会把这两个值传给服务端,规则就能正常读取到size完成校验:

// 拿到blob对象后,显式构造标准上传元数据
const uploadMetadata = {
  contentType: blob.type || 'application/octet-stream', // 补全文件类型,未读取到则使用默认二进制流类型
  size: blob.size
};
const result = await uploadBytes(fileRef, blob, uploadMetadata);

注意:此处size直接放在上传配置的根层级即可,不要嵌套在customMetadata字段下,这才是服务端request.resource.size读取的对应字段

方案2:转Uint8Array上传(兼容最优)

如果方案1存在机型兼容问题,可以绕开Blob polyfill的属性读取问题,直接读取本地文件转成Uint8Array格式上传,Firebase SDK会自动正确计算文件大小填充元数据:

// 先引入expo-file-system依赖
import * as FileSystem from 'expo-file-system';

// 替换原有XMLHttpRequest获取Blob的逻辑
const fileBase64 = await FileSystem.readAsStringAsync(uri, {
  encoding: FileSystem.EncodingType.Base64
});
const byteChars = atob(fileBase64);
const byteArray = new Uint8Array(byteChars.length);
for (let i = 0; i < byteChars.length; i++) {
  byteArray[i] = byteChars.charCodeAt(i);
}
// 直接传入Uint8Array上传即可
const result = await uploadBytes(fileRef, byteArray);
验证方式

修改完成后无需临时放开权限,保持原有大小限制规则即可:

service firebase.storage {
  match /b/{bucket}/o {
    match /{filename} {
      allow read, write: if request.resource.size < 99 * 1024 * 1024;
    }
  }
}

上传小体积测试文件时,服务端可以正确读取到request.resource.size的数值,大小判断逻辑返回true,不会再触发权限拒绝错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:42:12