【问题标题】:How to upload the public url for an image uploaded to the Firebase Cloud Storage to the Realtime Database [closed]如何将上传到 Firebase 云存储的图像的公共 URL 上传到实时数据库 [关闭]
【发布时间】:2020-09-20 00:28:05
【问题描述】:

将图像上传到 Firebase 云存储后,我想将其公共下载 URL 添加到我的实时数据库中的子节点。

我的文件上传代码

    private void uploadFile() {

        if (imageUri != null) {

            StorageReference fileRef = storageReference.child(UID + "/pic" + ".png");

            UploadTask uploadTask =  fileRef.putFile(imageUri);
            uploadTask.addOnSuccessListener(OrderPickupActivity.this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            imageURL = uri.toString();
                        }
                    });
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(OrderPickupActivity.this, e.toString(), Toast.LENGTH_LONG).show();
                }
            });

        } else {
            Toast.makeText(this, "Choose an image!", Toast.LENGTH_SHORT).show();
        }

    }

上传到实时数据库

uploadFile();

                    PickupDetails newPickup = new PickupDetails(
                            date,
                            time,
                            name,
                            email,
                            address,
                            pinCode,
                            UID,
                            phoneNumber,
                            imageURL
                    );

                    FirebaseDatabase.getInstance().getReference("Pending-Requests")
                            .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                            .setValue(newPickup)
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    //Toast.makeText(OrderPickupActivity.this, "Success!", Toast.LENGTH_LONG).show();
                                    progressBar.setVisibility(View.GONE);
                                    startActivity(new Intent(OrderPickupActivity.this, MainActivity.class));
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Toast.makeText(OrderPickupActivity.this, "Error, " + e, Toast.LENGTH_LONG).show();
                                    progressBar.setVisibility(View.GONE);
                                }
                            });

取件详情类

public class PickupDetails {

    public String date, time, userName, userEmail, userAddress, pinCode, userUID, phoneNumber, image;

    public PickupDetails(String date, String time, String userName, String userEmail, String userAddress, String pinCode, String userUID, String phoneNumber, String image) {
        this.date = date;
        this.time = time;
        this.userName = userName;
        this.userEmail = userEmail;
        this.userAddress = userAddress;
        this.pinCode = pinCode;
        this.userUID = userUID;
        this.phoneNumber = phoneNumber;
        this.image = image;
    }
}

我在 StackOverflow 上使用过类似问题的答案,但似乎没有一个对我有帮助。当我记录结果时,我能够获取该值,但它没有到达数据库。

【问题讨论】:

  • 看起来您实际上并没有尝试向实时数据库写入任何内容。
  • 我做了...对不起,我没有在问题中添加它
  • 如果没有看到无法按您期望的方式运行的代码,以及对您想要完成的工作的更完整描述,我们几乎无能为力。
  • 我将代码添加到数据库中,主要问题是,除了 imageURL 之外,所有其他值在数据库中都是可见的
  • 可能是因为在上传完成之前数据库正在更新。在你的代码中加入一些日志语句来调试它,看看它是如何工作的。 Firebase API 都是异步的。

标签: java android firebase firebase-realtime-database firebase-storage


【解决方案1】:

在 getDownloadUrl 监听器的 onSuccess 方法中:

databaseRef.child("images").push().setValue(uri.toString())
    .addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Toast.makeText(MainActivity.this, "Image uri saved.", Toast.LENGTH_SHORT).show();
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(MainActivity.this, "Error occured.", Toast.LENGTH_SHORT).show();

        }
    });    

【讨论】:

    【解决方案2】:

    正如Doug 所提到的,firebase API 是异步的,这意味着它们将在后台工作,同时让您的其余逻辑工作。诀窍是在任务完成后提交到数据库。我所要做的就是将我添加到 onSuccessListener 中的数据库逻辑。

    【讨论】:

      猜你喜欢
      • 2018-11-22
      • 2017-10-19
      • 2020-04-21
      • 2019-06-07
      • 2021-10-28
      • 2019-08-11
      • 2021-04-21
      • 2020-07-27
      • 2017-03-27
      相关资源
      最近更新 更多