【问题标题】:How to get imageUrl from firebase storage to store in firebase realtime database?如何从 firebase 存储中获取 imageUrl 以存储在 firebase 实时数据库中?
【发布时间】:2019-06-27 10:14:43
【问题描述】:

基本上,我创建了一个名为“俱乐部”的课程。我成功地将一个新俱乐部保存到 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();
                        }
                    })
                    .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+"%");
                        }
                    });
        }
    }

这一切都很好。但是,在同样的方法中,我也有这段代码,我尝试在其中获取上传图片的下载 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 has occurred。 该位置不存在对象。

有谁知道如何解决这个问题? 谢谢。

【问题讨论】:

    标签: java android firebase firebase-storage


    【解决方案1】:

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

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

    1. 上传文件
    2. 获取该文件的下载 URL

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

    getting a download URL after uploading 上的 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。按此顺序执行任务可防止您收到“对象在该位置不存在”错误消息。

    【讨论】:

      【解决方案2】:

      试试这个:

      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
      }
      

      【讨论】:

      • 当我这样做时,它会说“无法解析方法'getDownloadUrl()'”
      猜你喜欢
      • 2019-03-16
      • 2020-07-15
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2019-09-06
      • 1970-01-01
      • 2019-08-14
      相关资源
      最近更新 更多