将文件上传到 Firebase 云存储时出错:“rules_version = 1 不允许列出存储桶中的对象”

Posted

技术标签:

【中文标题】将文件上传到 Firebase 云存储时出错:“rules_version = 1 不允许列出存储桶中的对象”【英文标题】:Error on uploading file to firebase cloud storage: "Listing objects in a bucket is disallowed for rules_version = 1" 【发布时间】:2019-09-28 01:04:08 【问题描述】:

我已经在我的应用程序上设置了 Firebase 身份验证和云存储。但是,每当我尝试上传文件时,都会收到一个错误,我找不到任何相关信息。错误是 400: Bad Request 并带有以下消息

Listing objects in a bucket is disallowed for rules_version = "1". Please update storage security rules to rules_verison = "2" to use list.

我似乎找不到任何关于更新安全规则版本的信息。注意,当我查看firebase控制台时,实际上上传成功通过,但HTTP返回仍然是上面的错误。列出对象是什么意思?如何更新我的安全规则?

更多信息,我的上传代码(在 Kotlin 中)是

 fun uploadImage(uri: Uri, path: String): Task<Uri> 
            val storageRef = FirebaseStorage.getInstance().reference
            val storagePath = storageRef.child(path)
            return storagePath.putFile(uri).continueWithTask storageRef.downloadUrl 
 

我叫它

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        if (requestCode in 0..2 && resultCode == Activity.RESULT_OK) 
            val cropImageUri = CropImage.getActivityResult(data).uri
            val systemTime = System.currentTimeMillis()
            val path = "$userId/$systemTime"
            //IMAGE UPLOAD HERE:
            FirebaseImageResource.uploadImage(cropImageUri, path)
                    .addOnCompleteListener 
                if (it.isSuccessful) 
                    GlideApp.with(this)
                            .load(cropImageUri)
                            .into(imageViewForPosition(requestCode)!!)
                    imageUris[requestCode] = it.result.toString()
                
            
        
    

我的 firebase 规则是默认的:

service firebase.storage 
  match /b/bucket/o 
    match /allPaths=** 
      allow read, write: if request.auth != null;
    
  

我也成功通过 Facebook 登录进行身份验证

override fun onSuccess(loginResult: LoginResult) 
                val credential = FacebookAuthProvider.getCredential(loginResult.accessToken.token)
                auth.signInWithCredential(credential)
            

(它现在缺少成功监听器,但我知道它正在工作,因为当我不使用它时,我会收到未经授权的错误,并且文件实际上并没有上传)

【问题讨论】:

Firebase 团队在 GitHub 上为您创建了一个问题。你能在那里签到并回答一些关于这个问题的问题吗? github.com/firebase/firebase-android-sdk/issues/429 【参考方案1】:

您需要将此添加到您的 Firebase 存储规则中:

rules_version = '2';

一个例子是这样的:

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

我怀疑这是一个不太有用的错误消息。

【讨论】:

谢谢这里的语法,我懒得看规则文档了。我想知道是否有版主可以接受这个作为正确答案?这是一年多前发布的,考虑到观看次数,可能已经帮助了数千人。【参考方案2】:

只需将您的上传代码替换为

fun uploadImage(uri: Uri, path: String): Task<Uri> 
        val storageRef = FirebaseStorage.getInstance().reference
        val storagePath = storageRef.child(path)
        return storagePath.putFile(uri).continueWithTask storageRef.downloadUrl  

fun uploadImage(uri: Uri, path: String): Task<Uri> 
        val storageRef = FirebaseStorage.getInstance().reference
        val storagePath = storageRef.child(path)
        return storagePath.putFile(uri).continueWithTask storagePath.downloadUrl 

【讨论】:

【参考方案3】:

我用以下设置解决了它

    登录 Firebase 控制台 选择项目 点击存储按钮 选择规则选项卡 插入顶部“rules_version = '2';”

【讨论】:

以上是关于将文件上传到 Firebase 云存储时出错:“rules_version = 1 不允许列出存储桶中的对象”的主要内容,如果未能解决你的问题,请参考以下文章

将图像上传到 Firebase 存储并同时将文本输入到 Firestore 时出错

使用 Pickers 使用 Flutter Web 将照片上传到 Firebase 存储时出错

使用 Firebase 云功能将文件上传到云存储

将图像添加到 Firebase 存储时出错

使用 firebase 功能将图像上传到云存储错误

如何从输入字段将图像上传到 Firebase 云存储?