代码之家  ›  专栏  ›  技术社区  ›  Gastón Saillén

Firebase存储错误试图将数据插入我的数据库

  •  0
  • Gastón Saillén  · 技术社区  · 6 年前

    我一直在四处寻找一些问题,但没有弄清楚我做错了什么。

    现在,这是一件奇怪的事情,我正在用电子邮件和密码提供商进行身份验证,但奇怪的是,代码将我的图像上传到存储,但不断循环,将下载链接放在我的数据库中,然后只给我这个错误:

    E/StorageException:发生了StorageException。 用户没有访问此对象的权限。

    现在,我已经检查了我的规则,因为我的认证,我尝试了这两个没有任何成功

    service firebase.storage {
      match /b/my-bucket.appspot.com/o {
        match /{allPaths=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

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

    现在我也试过了

    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if true;
        }
      }
    }
    

    仍然有同样的问题。

     public void cargarProductoFirebase(final String nombreProducto, final float precioProducto, final Dialog dialog, final ProgressDialog progressDialog, Uri filePath) {
    
            mStorageReference.child("fotos").child(mAuth.getCurrentUser().getUid()).child(filePath.getLastPathSegment()).putFile(filePath).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                    if (!task.isSuccessful()) {
                        throw task.getException();
                    }
                    return mStorageReference.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()) {
                        Uri downloadUri = task.getResult();
                        Map<String, Object> producto = new HashMap<>();
                        producto.put("nombreProducto", nombreProducto);
                        producto.put("precioProducto", precioProducto);
                        producto.put("imagen",downloadUri.toString());
                        mDatabase.child("Usuarios").child(mAuth.getCurrentUser().getUid()).child("productos").push().updateChildren(producto).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
    
                                dialog.dismiss();
                                progressDialog.dismiss();
                                Toast.makeText(mContext, "Se cargo el producto correctamente.", Toast.LENGTH_SHORT).show();
    
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                progressDialog.dismiss();
                                Toast.makeText(mContext, "Error al cargar el producto" + e.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        });
    
                    } else {
                        Toast.makeText(mContext, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
    
        }
    

    2018-10-09 20:32:49.442 9767-9821/com.example.macbook.firebasemvp E/StorageException:发生了StorageException。 代码:-13021 HttpResult:403 2018-10-09 20:32:49.443 9767-9821/com.example.macbook.firebasemvp E/StorageException:{ “error”:{“code”:403,“message”:“开发人员凭据” java.io.IOException:{“error”:{“code”:403,“message”:“需要开发人员凭据。”}} 在com.google.firebase.storage.obfuscated.zzj.zza(com.google。firebase:firebase-storage@@16.0.2:3435) 在com.google.firebase.storage.obfuscated.zzc.zza(com.google。firebase:firebase-storage@@16.0.2:65) 在com.google.firebase.storage.zzc.run(com.google。firebase:firebase-storage@@16.0.2:68) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor。java:1162) 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor。java:636) 在java.lang.Thread.run(线程。java:764)

    文件也被上传到正确的地方,但错误仍然存在,无法将下载的URL放到数据库中

    enter image description here

    我缩小了代码,删除了数据库部分,但仍然存在相同的问题

     public void cargarProductoFirebase(final String nombreProducto, final float precioProducto, final Dialog dialog, final ProgressDialog progressDialog, Uri filePath) {
    
            mStorageReference.child("fotos").child(mAuth.getCurrentUser().getUid()).child(filePath.getLastPathSegment()).putFile(filePath).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                    if (!task.isSuccessful()) {
                        throw task.getException();
                    }
                    return mStorageReference.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()) {
                        Uri downloadUri = task.getResult();
                        Log.e(TAG, "onComplete: Success " );
    
                    } else {
                        Toast.makeText(mContext, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
    

    图片:

    enter image description here

    而且,没有 addOnProgressUpdate

    1 回复  |  直到 6 年前
        1
  •  1
  •   Frank van Puffelen    6 年前

    这个问题是由你打电话给 getDownloadUrl() :

    return mStorageReference.getDownloadUrl();
    

    我猜是这样的 mStorageReference 指向云存储bucket的根目录,因此您需要整个bucket的下载URL,这是不允许的。

    为了解决这个问题,至于 StorageReference

    StorageReference fileReference = mStorageReference.child("fotos").child(mAuth.getCurrentUser().getUid()).child(filePath.getLastPathSegment())
    fileReference.putFile(filePath).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
        @Override
        public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
            if (!task.isSuccessful()) {
                throw task.getException();
            }
            return fileReference.getDownloadUrl();
        }
        ...
    

    顺便说一句:我是通过从错误消息中搜索“所需的开发人员凭据”找到的]( https://www.google.com/search?q=firebase+storage+