如何将上传到Firebase云存储的图像的公共URL上传到实时数据库

时间:2020-06-01 16:36:32

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

将图像上传到Firebase Cloud Storage后,我想将其公共下载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上使用了类似问题的答案,但是似乎没有一个对我有帮助。记录结果时,我可以获取该值,但它无法到达数据库。

2 个答案:

答案 0 :(得分:0)

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

        }
    });    

答案 1 :(得分:0)

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