【问题标题】:How to retrieve the download URL of an image from Firebase Storage?如何从 Firebase 存储中检索图像的下载 URL?
【发布时间】:2018-05-30 07:04:15
【问题描述】:

我正在观看有关 Firebase 存储的旧教程。来自UploadTask.TaskSnapshotgetDownloadUrl() 方法已不存在,而documentation 我也不清楚。

到目前为止,我实施的是上传过程,我可以确认它可以正常工作,但是获取 URL 很痛苦,我无法按照他们解释的方式进行操作,因为:

1) 创建Task<Uri> urlTask = uploadTask.add[...]() 会导致IDE 出现以下错误:

我不明白,因为它在文档中指定。

2) 使用reference.getDownloadUrl() 会在查看上传图片的详细信息时显示与控制台上显示的不同的 URL。控制台显示的下载地址是

https://firebasestorage.googleapis.com/v0/b/chatroom-e44e6.appspot.com/o/chat_photos%2F73185640?alt=media&token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

同时显示日志

com.google.android.gms.tasks.xxx@xxxxxxx

我现在的完整代码:

if (requestCode == RC_PHOTO_PICKER) {
    if (data != null) {
        Toast.makeText(MainActivity.this, "Uploading...", Toast.LENGTH_SHORT).show();

        Uri file = data.getData();
        final StorageReference reference = mPhotoStorageReference.child(file.getLastPathSegment());
        UploadTask upload = reference.putFile(file);

        upload.addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(MainActivity.this, "Image could not be uploaded: " + e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }).addOnCompleteListener(this, new OnCompleteListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                ChatroomMessage message = new ChatroomMessage(null, mUsername, reference.getDownloadUrl().toString()); // <- com.google.android.gms.tasks.xxx@xxxxxxx
                mMessagesDatabaseReference.push().setValue(message);
                Toast.makeText(MainActivity.this, "Image uploaded!", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

我的应用已经实现了 Firebase UI 来处理登录操作,并且规则是

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

【问题讨论】:

    标签: java android firebase firebase-storage


    【解决方案1】:

    我付出了努力并浪费了更多时间,但这里是更通用和有效的解决方案

        private void uploadImage() {
    
        if (filePath != null) {
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setTitle("Uploading...");
            progressDialog.show();
            final StorageReference ref = storageReference.child("images/" +currentFirebaseUser.getUid() + "");
    
            ref.putFile(filePath)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            progressDialog.dismiss();
    
                            Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl();
                            while (!urlTask.isSuccessful());
                            Uri downloadUrl = urlTask.getResult();
                            Log.e("uri12",downloadUrl+"This is uri of image download");
                            Toast.makeText(AddItemActivity.this, "Uploaded", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            progressDialog.dismiss();
                            Toast.makeText(AddItemActivity.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 + "%");
                        }
                    });
        }
    }
    

    【讨论】:

      【解决方案2】:

      你有Permission denied error 这意味着你没有权限从 firebase 访问数据。请看这里

      如果您的安全规则是公开的,那么这里不需要许可,如果它不是公开的或安全的,那么您需要在从 firebase 获取数据之前通过 auth 登录,如果登录成功,那么您可以继续工作。

      check this 它将帮助您了解 Firebase 安全规则。

      【讨论】:

      • 对不起,我忘了提这个重要的细节。我已经登录了。我的应用实现了 Firebase UI 来处理这个问题。另外,我可以上传图片,它访问的下载 URL 不起作用。
      【解决方案3】:

      经过多次尝试,我设法解决了它。这是实现:

      Uri file = data.getData();
      final StorageReference reference = mPhotoStorageReference.child(file.getLastPathSegment());
      UploadTask upload = reference.putFile(file);
      
      upload.addOnFailureListener(this, new OnFailureListener() {
          @Override
          public void onFailure(@NonNull Exception e) {
              Toast.makeText(MainActivity.this, "Image could not be uploaded: " + e.getMessage(), Toast.LENGTH_LONG).show();
          }
      });
      
      upload.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();
              }
      
              return reference.getDownloadUrl();
          }
      }).addOnCompleteListener(new OnCompleteListener<Uri>() {
          @Override
          public void onComplete(@NonNull Task<Uri> task) {
              if (task.isSuccessful()) {
                  Uri downloadUrl = task.getResult();
                  ChatroomMessage message = new ChatroomMessage(null, mUsername, downloadUrl.toString());
      
                  mMessagesDatabaseReference.push().setValue(message);
      
                  Toast.makeText(MainActivity.this, "Image uploaded!", Toast.LENGTH_SHORT).show();
              } else {
                  Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show();
              }
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2020-07-10
        • 2017-07-02
        • 2017-09-16
        • 2018-03-23
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 2018-02-04
        相关资源
        最近更新 更多