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

时间:2019-02-03 13:03:50

标签: java android firebase firebase-storage

基本上,我创建了一个名为“俱乐部”的类。我成功地将新俱乐部成功保存到了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。     对象在该位置不存在。

有人知道如何解决此问题吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

  

我知道对于同一件事有两个OnSuccessListener效率低下

您要完成两项任务:

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

由于这是两个单独的任务,因此您将需要两个insert into account_info.master values (123456789876, 'test', 'test1', test2', TRUE, FALSE, FALSE, NULL, NULL, NULL, NULL, NULL, 'aKJSLKJDFL', 'ashdfjalskjflh', 'akshdkfhkdhfksdhfk', 'asdfsfsfsfdsf'); 。没有什么低效的,任务也不一样。

getting a download URL after uploading上的Firebase文档精确显示了如何连续完成以下两项任务:

OnSuccessListeners

您会注意到,此代码首先完成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 // ... } } }); (将上传文件),然后才开始执行新任务以获取下载URL。按此顺序执行任务可防止您收到“该位置不存在对象”错误消息。

答案 1 :(得分:0)

尝试使用:

/

创建updatetoFirebaseDatabase(String imageUrl)方法:

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