【问题标题】:Firebase "putFile()" for more than one file at a time (Kotlin)Firebase“putFile()”一次处理多个文件(Kotlin)
【发布时间】:2022-01-10 07:28:24
【问题描述】:

我正在研究一种将多个文件(一次)传递到 Firebase 存储的方法。为此,我使用了putFile() 方法。此方法适用于 1 个文件,但我正在努力让它一次适用于多个文件(存储在 ArrayList 中)。以下是我使用的逻辑(我知道这是错误的。非常感谢任何帮助):

  1. 将我想要传递到存储文件夹的文件存储在ArrayList
  2. 使用for-loop,遍历上述ArrayList并将项目放在[i] --changes
  3. OnSuccessListener 中为 2,downloadUrl
  4. 初始化ArrayList 以存储downloadUrl 结果
  5. OnSuccessListener for 3 中,仅当当前位置 (i) 为 == ArrayList.size-1 时,将从 3 下载的 url 添加到更新的ArrayList 中。我使用它是为了在每次调用该方法时(即循环运行时)都没有任何重复的实例,但该方法仅在前 4 个(以上)完成时才被调用
  6. 调用将 5(+ 其他)生成的 ArrayList 上传到 rtdb 的方法

下面是我写的代码:

    for (i in 0 until arrayList.size){
        storageRef.putFile(arrayList[i])
            .addOnSuccessListener {
                Log.d("TAG", "Successfully uploaded file: ${it.metadata?.path}")

                storageRef.downloadUrl.addOnSuccessListener { it ->
                    it.toString()
                    Log.d("TAG", "File location: $it")
                    
                    updatedArrayList.add(it.toString())

                    if (i == arrayList.size){                   
                        //method that creates an instance of an object and passes data to the rtdb (firebase)
                        createInstanceUploadToFirebase(id, updatedArrayList)
                    }
                }
            }
    }

上面的问题是,当我尝试使用downloadUrl 访问(使用生成的downloadUrl 加载文件)文件(最后一个除外)时,我现在收到以下错误,并且似乎只是可以访问最后一个索引处的项目:

    {
      "error": {
        "code": 403,
        "message": "Permission denied."
      }
    }

任何帮助表示赞赏(:

【问题讨论】:

  • 成功生成的下载 URL 应该从不给出 403,因为它提供了对文件的公共访问权限。如果您登录 it.toString() 并尝试在浏览器中打开该 URL,您可以访问该文件吗?
  • @FrankvanPuffelen 我尝试使用浏览器加载网址,但它给了我同样的错误。不知道是不是和我嵌套的if语句有关
  • 嗯...我不确定。希望其他人看到可能导致这种情况的原因。
  • @FrankvanPuffelen 不用担心,感谢您的关注(:您知道是否还有其他方法可以完成任务?
  • 检查您的 Firebase 存储安全规则。您可能拒绝了传入的请求。

标签: java android kotlin firebase-storage


【解决方案1】:

问题不在于逻辑,而在于存储的安全规则。这就是我解决问题的方法:

将存储安全规则更新为:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow write: if request.auth != null; 
      allow read;
    }
  }
}

问题中详述的错误原因: 默认读取和写入规则仅允许用户在经过身份验证后从存储中读取。使用上述存储规则更改此设置应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多