上传文件到Firebase后如何获取文件的URL?

25
一旦您将文件上传至Firebase,如何获取其URL以便稍后使用?我想将URL写入Firebase数据库,以便其他用户可以访问该图像。
我是这样上传文件的:
public void uploadFile()
{

    StorageReference filepath = mstorageRef.child("folder").child(filename);

    Uri File= Uri.fromFile(new File(mFileName));

    filepath.putFile(File).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot)
        {
            Toast.makeText(MtActivity.this, "Upload Done", Toast.LENGTH_LONG).show();
        }
    });
}

我已确认文件正在上传,现在我只需要URL,以便将其写入我的数据库。然而,当我尝试这样做时:

Uri downloadUrl = taskSnapshot.getMetadata().getDownloadUrl();

它给我一个错误并显示此方法仅应从测试或私有范围内访问

我不确定这是什么意思,也不知道为什么会出现这个错误,因为我正在遵循Firebase提供的此示例

是否有一种新的获取URL的方式?

另外,那个URL对于特定的项目是唯一的吗?也就是说,如果我将其存储到数据库中并尝试稍后访问它,我能够这样做吗?


你应该写 taskSnapshot.getDownloadUrl(),而不是 taskSnapshot.getMetadata().getDownloadUrl() - Anggrayudi H
@AnggrayudiH 我尝试了这个方法,但是却得到了相同的错误信息。由于某种原因,它就是不允许我在addOnSuccessListener()方法内调用该方法。 - Isabel Alphonse
关于您看到的错误,您是否看过这篇文章 - AL.
请查看此解决方案 https://dev59.com/_Kvka4cB1Zd3GeqPnxnB 它对我有效。 - uche Godfrey
13个回答

0
 filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                String category = spinner.getSelectedItem().toString();
                                String title = ((EditText) findViewById(R.id.post_title)).getText().toString();
                                String description = ((EditText) findViewById(R.id.post_description)).getText().toString();
                                final Post post = new Post(userId, category, title, description, latitude, longitude, true);
                                post.setAddressList(addressLine);
                                post.setContact(contact);

                                if (addressLine != null) {
                                    post.setPlace(addressLine.split(",")[2]);
                                }
                                post.setId(key);
                                post.setImage(uri.toString());
                                databaseReference.setValue(post).addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        if (task.isSuccessful()) {

                                            ((EditText) findViewById(R.id.post_title)).setText("");
                                            ((EditText) findViewById(R.id.post_description)).setText("");
                                            postImageButton.setImageURI(null);
                                            progressBarDialog.dismiss();
                                            Toast.makeText(PostActivity.this, "Your request is sucessfully completed", Toast.LENGTH_SHORT).show();
                                        } else if (!task.isSuccessful()) {
                                            progressBarDialog.dismiss();
                                            Toast.makeText(PostActivity.this, "Your request is not completed", Toast.LENGTH_SHORT).show();
                                        }

                                    }
                                });
                            }

                        });
                    }

-1
你尝试过 taskSnapshot.getDownloadUrl() 吗?如果这个也不行,你可以在成功监听器中通过 mstorageRef.child("folder").child(filename).toString() 获取图片位置。

我尝试了taskSnapshot.getDownloadUrl(),但它给出了相同的错误。此外,我该如何使用你展示给我的另一种方法?另一种方法对我有什么作用?我该如何获取文件? - Isabel Alphonse
Url 就是 Firebase 存储图像的路径,因此在上传成功后,您应该知道存储上正在创建一个路径,因此请使用相同的存储引用 o 进行保存,并将其转换为字符串.. 在您的代码中 filepath.toString() - amar
这很有道理。但是如果我在另一个活动中并且想要访问该图像,我该怎么做?由于我无法访问mstorageRef,我该如何访问该图像? - Isabel Alphonse
在我的工作中,图像总是与对象数据相关联的,因此获取图像URL并将其存储在mDatabase中与对象数据一起,然后从任何活动中检索数据库中图像的路径。 - amar
没错!如果我有URL,就可以直接访问图像了,但是我该如何获取它呢?如果我使用mstorageRef.child("folder").child(filename).toString(),我将获得存储位置,而不是HTTP URL。 - Isabel Alphonse
即使使用 taskSnapshot.getDownloadUrl(),您只能获取存储引用位置。请使用 Glide 显示该位置的图像。 - amar

-2

试试这个:

final Uri uri = data.getData();

StorageReference filepath = mStorageRef.child("folder").child(filename);
filepath.putFile(uri).addOnSuccessListener(new 

OnSuccessListener<UploadTask.TaskSnapshot>() {

        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

            Uri downloadUri = taskSnapshot.getDownloadUrl();
            //Getting url where image is stored
            //downloadUri will store image URI
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接