为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 firebase 存储中获取 imageUrl 以存储在 firebase 实时数据库中?

如何从 firebase 存储中获取 imageUrl 以存储在 firebase 实时数据库中?

饮歌长啸 2022-06-04 14:53:15
基本上我创建了一个名为“俱乐部”的课程。我成功地将一个新俱乐部保存到 Firebase 实时数据库,没有任何实际问题,直到我想将 Firebase 存储中的 imageURL(称为 clubImage)添加到我的俱乐部类。我可以使用以下代码成功地将我的图像上传到 Firebase 存储。    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();                        }    }这一切都很好。但是,在同样的方法中,我也有这段代码,我尝试在其中获取上传图像的下载 URL。            ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {                @Override                public void onSuccess(Uri uri) {                    Uri downloadUrl = uri;                    clubImage = downloadUrl.toString();                }            });我知道为同一件事设置两个 OnSuccessListener 效率很低,我只是不确定如何同时上传图像和获取 downloadUrl。无论如何,这不起作用,我的新俱乐部在没有 clubImage 字段的情况下保存。我收到错误:E/StorageException:StorageException 已发生。对象在该位置不存在。有谁知道如何解决这一问题?谢谢。
查看完整描述

2 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

我知道为同一件事设置两个 OnSuccessListener 效率低下


您有两个要尝试完成的任务:


上传一个文件

获取该文件的下载 URL

由于这是两个独立的任务,因此您需要两个OnSuccessListeners. 这并没有什么低效的地方,任务也不尽相同。


上传后获取下载 URL的 Firebase 文档准确地展示了如何连续完成这两个任务:


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

            // ...

        }

    }

});

您会注意到,此代码首先完成uploadTask(上传文件),然后才开始一个新任务以获取下载 URL。按此顺序执行任务可防止您收到“对象在该位置不存在”错误消息。


查看完整回答
反对 回复 2022-06-04
?
www说

TA贡献1775条经验 获得超8个赞

尝试使用这个:


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();

            }

        }

    });

........... 

创建 updatetoFirebaseDatabase(String imageUrl) 方法:


updatetoFirebaseDatabase(String imageUrl){

    //implement FirebaseDatabase setvalue method with given image URL

}


查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 258 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号