【问题标题】:Unable to retrieve image's download URL from Firebase Storage (getting exception) [NEED URGENT HELP]无法从 Firebase 存储中检索图像的下载 URL(出现异常)[需要紧急帮助]
【发布时间】:2019-07-08 10:46:49
【问题描述】:

代码成功地将图像上传到 Firebase 存储,但没有返回下载 URL。我该如何解决这个问题?

我得到这个异常:java.lang.IllegalArgumentException: getDownloadUrl() is not supported at the root of the bucket. 为什么?

private void uploadFile() {
    if (mImageUri != null) {
        StorageReference fileReference = mStorageRef.child(System.currentTimeMillis()
                + "." + getFileExtension(mImageUri));

        fileReference.putFile(mImageUri).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 mStorageRef.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if (task.isSuccessful()) {
                    Uri downloadUri = task.getResult();
                        System.out.println("Upload success: " + downloadUri);
                } else {
                    // Handle failures
                    // ...
                }
            }
        });

    } else {
        Toast.makeText(this, "No file selected", Toast.LENGTH_SHORT).show();
    }

}

【问题讨论】:

标签: java android firebase firebase-storage


【解决方案1】:

我认为返回下载地址有问题,试试下面的代码:

private void uploadFile() {
    if (mImageUri != null) {
        StorageReference fileReference = mStorageRef.child(System.currentTimeMillis()
                + "." + getFileExtension(mImageUri));

        fileReference.putFile(mImageUri).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
                //change made here
                return fileReference.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if (task.isSuccessful()) {
                    Uri downloadUri = task.getResult();
                        System.out.println("Upload success: " + downloadUri);
                } else {
                    // Handle failures
                    // ...
                }
            }
        });

    } else {
        Toast.makeText(this, "No file selected", Toast.LENGTH_SHORT).show();
    }

}

【讨论】:

    【解决方案2】:

    所以我有同样的问题。我有一个使用了两年的代码,但在 Firebase 中似乎发生了一些变化。 Bellow 是一个可以工作并解决这个问题的新代码。 Ps:它在 kotlin 中,但您可以在参考链接中找到 android 示例,然后根据我的代码进行调整。

    首先声明一个全局变量 private lateinit var filePath: Uri

    然后将您的图像放入此 uri 文件中。

    然后转到您要上传的代码:

        mFireBaseStorage = FirebaseStorage.getInstance()
        mphotoStorageReference = mFireBaseStorage.reference  //storage references
    
        val storageRef = mphotoStorageReference.child("usuarios_img")  //path in storage. This is the folder name in storage
    
        val bmp: Bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath)
        val baos: ByteArrayOutputStream = ByteArrayOutputStream()
        bmp.compress(Bitmap.CompressFormat.JPEG, 25, baos) //choose compreess rate (100 means no compression)
    
        //get the uri from the bitmap
        val tempUri: Uri = getImageUri(this, bmp)
        //transform the new compressed bmp in filepath uri
        filePath = tempUri  //filePath is a global variable Uri
    
    
       
       var uploadTask = storageRef.child("the_name_of_the_file).putFile(filePath)
    
        // [START upload_get_download_url]
        val ref = storageRef
        uploadTask = ref.putFile(filePath)
    
        val urlTask = uploadTask.continueWithTask { task ->
            if (!task.isSuccessful) {
                task.exception?.let {
                    throw it
                }
            }
            ref.downloadUrl
        }.addOnCompleteListener { task ->
            if (task.isSuccessful) {
                val downloadUri = task.result
                Log.d("test", "worked, this is the url link "+downloadUri)
                
               
            } else {
                // Handle failures
                Log.d("test", "error")
    
            }
        }
    

    就是这样。

    参考 https://firebase.google.com/docs/storage/android/upload-files?hl=pt-br

    希望它有所帮助,因为我已经浪费了几个小时。

    【讨论】:

      【解决方案3】:
      <style name="Widget.Material.TextView.ListSeparator" parent="Widget.TextView.ListSeparator">
          <item name="background">@drawable/list_section_divider_material</item>
          <item name="textAllCaps">true</item>
      
       - </style>
      
      <style name="Widget.Material.Light.TextView.ListSeparator" parent="Widget.Material.TextView.ListSeparator"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 2021-01-17
        • 2017-02-08
        • 2014-10-25
        • 2022-10-13
        相关资源
        最近更新 更多