我一直在寻找一些问题,但无法理解我做错了什么。
我正在尝试将文件上传到Firebase存储,然后将下载URL写入数据库中的节点内。
现在,这很奇怪,我正在使用电子邮件和密码提供程序进行身份验证,但是很奇怪的是,代码将我的图像上传到存储设备,但不断循环以将下载链接放置在数据库中,然后仅给出我这个错误:
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;
}
}
}
仍然存在相同的问题。
这是我用来将文件上传到存储并将downloadurl放入我的数据库中的代码
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:{ “错误”:{“代码”:403,“消息”:“开发人员凭据 必须。”}} java.io.IOException:{“错误”:{“代码”:403,“消息”:“需要开发者凭证。” }} com.google.firebase.storage.obfuscated.zzj.zza(com.google.firebase:firebase-storage @@ 16.0.2:455) 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.obfuscated.zzc.zza(com.google.firebase:firebase-storage @@ 16.0.2:57) 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(Thread.java:764)
也将文件上传到正确的位置,但错误仍然存在,无法将下载URL放置到数据库中
我压缩了代码并删除了数据库部分,仍然是同样的问题
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();
}
}
});
图片:
还没有像旧存储实现那样的addOnProgressUpdate
吗?
答案 0 :(得分:1)
问题是由您致电getDownloadUrl()
引起的:
return mStorageReference.getDownloadUrl();
我的猜测是mStorageReference
指向您的Cloud Storage存储桶的根,因此您要求提供整个存储桶的下载URL,这是不允许的。
要解决此问题,关于您实际写给的StorageReference
的下载URL:
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+“开发人员+凭据+必需”)。