Java 如何从firebase存储中获取imageUrl以存储在firebase实时数据库中?
基本上,我创建了一个名为“俱乐部”的类。我成功地将一个新的club保存到firebase实时数据库,没有任何实际问题,直到我想将一个imageURL(称为ClubiImage)从firebase存储添加到我的club类 我能够使用以下代码成功地将我的图像上载到Firebase存储Java 如何从firebase存储中获取imageUrl以存储在firebase实时数据库中?,java,android,firebase,firebase-storage,Java,Android,Firebase,Firebase Storage,基本上,我创建了一个名为“俱乐部”的类。我成功地将一个新的club保存到firebase实时数据库,没有任何实际问题,直到我想将一个imageURL(称为ClubiImage)从firebase存储添加到我的club类 我能够使用以下代码成功地将我的图像上载到Firebase存储 private void uploadImage() { //upload selected image to database //code from https://code
private void uploadImage() {
//upload selected image to database
//code from https://code.tutsplus.com/tutorials/image-upload-to-firebase-in-android-application--cms-29934
if(filePath != null)
{
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Uploading...");
progressDialog.show();
final StorageReference ref = storageReference.child("images/"+ UUID.randomUUID().toString());
ref.putFile(filePath)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
progressDialog.dismiss();
Toast.makeText(AddClubActivity.this, "Uploaded", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
progressDialog.dismiss();
Toast.makeText(AddClubActivity.this, "Failed "+e.getMessage(), Toast.LENGTH_SHORT).show();
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot
.getTotalByteCount());
progressDialog.setMessage("Uploaded "+(int)progress+"%");
}
});
}
}
private void uploadImage(){
//将所选图像上载到数据库
//代码来自https://code.tutsplus.com/tutorials/image-upload-to-firebase-in-android-application--cms-29934
if(filePath!=null)
{
final ProgressDialog ProgressDialog=新建ProgressDialog(此);
progressDialog.setTitle(“上载…”);
progressDialog.show();
final-storagereferef=StorageReference.child(“images/”+UUID.randomUUID().toString());
ref.putFile(文件路径)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
progressDialog.disclose();
Toast.makeText(addclubativity.this,“上载”,Toast.LENGTH_SHORT.show();
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
progressDialog.disclose();
Toast.makeText(addclubativity.this,“Failed”+e.getMessage(),Toast.LENGTH\u SHORT.show();
}
})
.addOnProgressListener(新的OnProgressListener(){
@凌驾
public void onProgress(UploadTask.TaskSnapshot TaskSnapshot){
双进度=(100.0*taskSnapshot.GetByTestTransferred()/taskSnapshot
.getTotalByteCount());
progressDialog.setMessage(“上传”+(int)进度+“%”;
}
});
}
}
这一切都很好。然而,在相同的方法中,我也有这段代码,这是我尝试获取上传图像的下载URL的地方
ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Uri downloadUrl = uri;
clubImage = downloadUrl.toString();
}
});
ref.getDownloadUrl().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
Uri downloadUrl=Uri;
clubImage=downloadUrl.toString();
}
});
我知道,对于同一件事,使用两个OnSuccessListener是低效的,我只是不知道如何同时上传图像和获取下载URL。
不管怎样,这是行不通的,我的新俱乐部在没有clubImage字段的情况下进行储蓄。
我得到错误:E/StorageException:StorageException已发生。
对象在位置处不存在
有人知道如何解决这个问题吗?
谢谢。尝试使用以下方法:
private Uri ImageUri; //and get image from gallery intent to this ImageUri
...............
StorageReference filePath = FirebaseStorage.getInstance().getReference().child("Club Images").child(ImageUri.getLastPathSegment() + ".jpg");
filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
{
if(task.isSuccessful())
{
downloadUrl = task.getResult().getDownloadUrl().toString();
updatetoFirebaseDatabase();
}
else
{
String message = task.getException().getMessage();
}
}
});
...........
尝试使用以下方法:
private Uri ImageUri; //and get image from gallery intent to this ImageUri
...............
StorageReference filePath = FirebaseStorage.getInstance().getReference().child("Club Images").child(ImageUri.getLastPathSegment() + ".jpg");
filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
{
if(task.isSuccessful())
{
downloadUrl = task.getResult().getDownloadUrl().toString();
updatetoFirebaseDatabase();
}
else
{
String message = task.getException().getMessage();
}
}
});
...........
我知道在同一件事上使用两个OnSuccessListener是低效的
您有两项任务要完成:
OnSuccessListeners
。这没有什么低效的,任务也不一样
上的Firebase文档精确显示了如何连续完成这两项任务:
final-storagereferef=storageRef.child(“images/mountains.jpg”);
uploadTask=ref.putFile(文件);
Task urlTask=uploadTask.continueWithTask(新的Continuation(){
@凌驾
公共任务(@NonNull Task Task)引发异常{
如果(!task.issusccessful()){
抛出task.getException();
}
//继续执行任务以获取下载URL
return ref.getDownloadUrl();
}
}).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Uri downloadUri=task.getResult();
}否则{
//处理故障
// ...
}
}
});
您将注意到,这段代码首先完成上传任务
(上传文件),然后才启动新任务以获取下载URL。按此顺序执行任务可防止收到“位置上不存在对象”错误消息
我知道在同一件事上使用两个OnSuccessListener是低效的
您有两项任务要完成:
OnSuccessListeners
。这没有什么低效的,任务也不一样
上的Firebase文档精确显示了如何连续完成这两项任务:
final-storagereferef=storageRef.child(“images/mountains.jpg”);
uploadTask=ref.putFile(文件);
Task urlTask=uploadTask.continueWithTask(新的Continuation(){
@凌驾
公共任务(@NonNull Task Task)引发异常{
如果(!task.issusccessful()){
抛出task.getException();
}
//继续执行任务以获取下载URL
return ref.getDownloadUrl();
}
}).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Uri downloadUri=task.getResult();
}否则{
//处理故障
// ...
}
}
});
您将注意到,这段代码首先完成上传任务
(上传文件),然后才启动新任务以获取下载URL。执行官
final StorageReference ref = storageRef.child("images/mountains.jpg");
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();
}
// Continue with the task to get the download URL
return ref.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
} else {
// Handle failures
// ...
}
}
});