我搜索了很多有关堆栈溢出的问题,寻找答案,但是没有一个对我有用。
我正在使用类似下面的代码将图像从用户的设备上传到Firebase存储,并与之一起使用上传的图像的URL更新Firebase中的imageURL
节点。
private void uploadFile(Bitmap bitmap) {
FirebaseStorage storage = FirebaseStorage.getInstance();
final StorageReference storageRef = storage.getReference();
final StorageReference ImagesRef = storageRef.child("images/"+mAu.getCurrentUser().getUid()+".jpg");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos);
byte[] data = baos.toByteArray();
UploadTask uploadTask = ImagesRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.i("whatTheFuck:",exception.toString());
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onSuccess(final UploadTask.TaskSnapshot taskSnapshot) {
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
Task<Uri> downloadUrl = taskSnapshot.getMetadata().getReference().getDownloadUrl();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users").child(mAu.getCurrentUser().getUid());
Log.i("seeThisUrl", downloadUrl.toString());
ref.child("imageURL").setValue(downloadUrl.toString());
}
});
但是imageURL始终不是我所期望的,它具有以下形式:
com.google.android.gms.tasks.zzu@51bc124
不是实际的URL,我无法找到为什么会这样的答案。
答案 0 :(得分:0)
您正在打印:
com.google.android.gms.tasks.zzu@51bc124
因为这是downloadUrl
对象的内存中的地址,该地址的类型为Task<Uri>
,不是实际的Uri。
根据有关如何get a download URL的官方文档:
上传文件后,您可以通过调用StorageReference上的
getDownloadUrl()
方法来获取下载文件的URL:
final StorageReference ref = storageRef.child("/* Your path */");
uploadTask = ref.putFile(file);
Task<Uri> urlTask = uploadTask.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 ref.getDownloadUrl(); //Call the getDownloadUrl() method
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
} else {
// Handle failures
}
}
});
这是文档中的示例。