如何从 Firebase Storage 获取下载网址?

Posted

技术标签:

【中文标题】如何从 Firebase Storage 获取下载网址?【英文标题】:How to get the download url from Firebase Storage? 【发布时间】:2019-04-17 09:39:34 【问题描述】:

我想从 Firebase 的 uploadTask.addOnProgressListener 方法获取下载 URL。如何使用以下代码获取下载网址?

    UploadTask uploadTask = storageRef.putBytes(data);

    uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>()
    
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot)
        
            Log.d("aaaaasessin",""+taskSnapshot.getTask().getResult());
        
    );

我使用了taskSnapshot.getTask().getResult(),但这不起作用。

【问题讨论】:

【参考方案1】:

2019 年 8 月 22 日编辑:

最近在 android SDK 中的 StorageReference 类中添加了一个新方法,名为 list()。

要解决这个问题,您需要遍历 ListResult 并调用 getDownloadUrl() 以获取每个文件的下载 URL。记住getDownloadUrl() 方法是异步的,所以它返回一个Task 对象。请参阅以下详细信息。


为了获取下载地址,您需要使用addOnSuccessListener,如以下代码行:

uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() 
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
        storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() 
            @Override
            public void onSuccess(Uri uri) 
                String url = uri.toString();

                //Do what you need to do with url
            
        );
    
);

正如 2018 年 5 月 23 日的 Firebase release notes 中提到的那样:

云存储版本 16.0.1

删除了已弃用的 StorageMetadata.getDownloadUrl() 和 UploadTask.TaskSnapshot.getDownloadUrl() 方法。要获取当前下载 URL,请使用 StorageReference.getDownloadUr()。

所以现在当在StorageReference 对象上调用getDownloadUrl() 时,它会返回一个Task 对象并且不再是一个Uri 对象。

还请记住,如果您的设备无法访问 Firebase 存储后端,则不会调用成功侦听器和失败侦听器(如果您打算使用它)。只有在数据被提交到 Firebase 服务器或被 Firebase 服务器拒绝后,才会调用成功/失败监听器。

【讨论】:

感谢您的回答,但是,我离线执行上传任务,所以无法使用 onSuccsess()。我只能使用 uploadTask.addOnProgressListener() 是的,没错,onSuccsess() 在 offfile 时不会触发,但不幸的是使用 addOnSuccessListener 你不能覆盖 onSuccess() 方法来获取下载 url。这是有道理的,因为只有从服务器获得响应(触发 onSuccess)后,您才能获得下载 url。只要任务没有完成,就无法获取下载地址,对吧? 好的,如果有任何替代方法,请建议我 不,没有。 只有在上传成功后才能获取下载的url,也就是当服务器为你提供url时。当您处于离线状态并且设备与服务器之间没有直接连接时,您将无法获取 url。我可以帮助您了解其他信息吗?

以上是关于如何从 Firebase Storage 获取下载网址?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase Storage 获取图像并在 Angular 2 ngFor 中显示它们

有没有一种简单的方法可以从 Angular 模板中的 firebase-storage 路径获取下载 url

如何从离子3中的firebase-storage获取图像

从 Flutter 中的 Firebase 存储获取下载 URL

如何从 Firebase 存储中获取图像文件名?

如何将 Url 从 Firebase Storage 存储到 ArrayList 中?