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

Firebase技术疑问:如何在Cloud Storage写入成功后再写入Realtime Database?

解决方案

要实现仅在Cloud Storage上传成功后才写入Realtime Database的逻辑,需要从两个核心点修改代码:

1. 让Cloud Storage上传函数暴露执行结果

原代码里saveToCloudStorage用空catch吃掉了所有错误,外部无法判断上传是否成功。我们需要调整这个函数,让执行状态可以被外部感知:

写法一:移除空catch,让错误向外抛出

// 修改为Future<void>,允许外部await并捕获错误
Future<void> saveToCloudStorage(String filepath, String filename) async {
  _firebaseStoragePath = MyAppStorageDir + filename;
  
  File file = File(filepath);

  // 去掉空catch,上传失败时直接抛出异常
  await _firebaseStorage
      .ref(_firebaseStoragePath)
      .putFile(file);
}

写法二:保留catch,返回布尔值表示成功状态

// 返回bool,明确告知外部上传是否成功
Future<bool> saveToCloudStorage(String filepath, String filename) async {
  _firebaseStoragePath = MyAppStorageDir + filename;
  
  File file = File(filepath);

  try {
    await _firebaseStorage
        .ref(_firebaseStoragePath)
        .putFile(file);
    return true; // 上传成功
  } catch (e) {
    // 可在此添加错误日志逻辑
    return false; // 上传失败
  }
}

2. 在sendFile中等待上传结果,再触发数据库写入

修改sendFile函数,通过await等待上传完成,仅在成功时调用saveToRTDB:

对应写法一的实现

void sendFile(ChatData file, String filepath, String filename) async {
  try {
    // 等待Cloud Storage上传完成
    await saveToCloudStorage(filepath, filename);
    // 上传成功后,才执行数据库写入
    saveToRTDB(file);
  } catch (e) {
    // 可在此添加上传失败的处理,比如提示用户
  }
}

对应写法二的实现

void sendFile(ChatData file, String filepath, String filename) async {
  bool uploadSuccess = await saveToCloudStorage(filepath, filename);
  if (uploadSuccess) {
    saveToRTDB(file);
  } else {
    // 可在此添加上传失败的处理逻辑
  }
}

补充说明

  • 原代码中async函数声明为void会导致无法正确等待执行结果,因此必须改为Future<void>或Future<bool>类型。
  • saveToRTDB仍保持“即发即弃”的特性,但只会在Cloud Storage上传成功后被触发,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:27:34