簡體   English   中英

如何從Firebase存儲中獲取imageUrl以存儲在Firebase實時數據庫中?

[英]How to get imageUrl from firebase storage to store in firebase realtime database?

基本上,我創建了一個名為“俱樂部”的類。 我成功地將新俱樂部成功保存到了Firebase實時數據庫中,沒有任何實際問題,直到我想將Firebase Storage中的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+"%");
                        }
                    });
        }
    }

這一切都很好。 但是,在同一方法中,我也有此代碼,這是我嘗試獲取上載圖像的downloadURL的地方。

            ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    Uri downloadUrl = uri;
                    clubImage = downloadUrl.toString();
                }
            });

我知道對於同一件事有兩個OnSuccessListeners效率不高,我只是不確定如何同時上傳圖像和同時獲取downloadUrl。 無論如何,這是行不通的,如果沒有clubImage字段,我的新俱樂部將保存。 我收到錯誤:E / StorageException:發生StorageException。 對象在該位置不存在。

有誰知道如何解決這一問題? 謝謝。

我知道對於同一件事有兩個OnSuccessListeners效率不高

您有兩個要完成的任務:

  1. 上傳一個文件
  2. 獲取該文件的下載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。 按此順序執行任務可以防止出現“對象在位置不存在”錯誤消息。

嘗試使用此:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM