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

Flutter上传文件至Firebase Storage失败,求排查object-not-found错误

问题原因分析

你遇到的firebase_storage/object-not-found错误,核心原因是上传文件时没有指定具体的文件名:
你的代码中storage.ref().child('cartesPro/')指向的是Firebase Storage中的虚拟目录,而非具体的文件路径。Firebase Storage不允许直接向目录引用上传文件,必须指定明确的文件名,否则上传后无法生成有效的文件对象,后续调用getDownloadURL()时自然会找不到对应对象,返回404错误。

修复方案

修改uploadFile方法,为上传的文件指定唯一文件名(比如结合时间戳和原文件名生成,避免文件覆盖):

import 'dart:io';

class DatabaseMethods {

  CollectionReference cartesPro =
      FirebaseFirestore.instance.collection('cartesPro');
  FirebaseStorage storage = FirebaseStorage.instance;

  Future<String> uploadFile(File file) async {
    // 生成唯一文件名,防止重复上传覆盖文件
    String fileName = '${DateTime.now().millisecondsSinceEpoch}_${file.path.split('/').last}';
    // 指定完整的文件存储路径:目录 + 文件名
    Reference reference = storage.ref().child('cartesPro/$fileName');
    print('REFERENCE: ${reference}');
    
    UploadTask uploadTask = reference.putFile(file);
    TaskSnapshot taskSnapshot = await uploadTask;
    
    return await taskSnapshot.ref.getDownloadURL();
  }

  void addFile(CartPro cartPro) {
    cartesPro.add({
      "cartUserId": cartPro.cartUserId,
      "cartTimestamp": FieldValue.serverTimestamp()
    });
  }
}
额外检查项
  • 文件有效性验证:确保传入的file是存在的有效文件,可在上传前增加判断:
    if (!await file.exists()) {
      throw Exception('待上传文件不存在');
    }
    
  • Storage权限规则检查:确认Firebase Storage的安全规则允许上传操作,测试阶段可临时设置为开放规则(上线前务必修改为严格权限):
    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if true;
        }
      }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:10:23