从 Firebase 存储下载文件非常慢

Posted

技术标签:

【中文标题】从 Firebase 存储下载文件非常慢【英文标题】:Downloading Files from Firebase Storage is very slow 【发布时间】:2021-05-26 20:24:40 【问题描述】:

场景: 我正在从 firebase 存储下载图像/视频文件并将它们显示在列表中。

问题: 响应速度很慢。下载图像/视频需要太多时间。

代码

Directory tempDir = await getTemporaryDirectory();
final File tempFile = File('$tempDir.path/$fileName');
if(tempFile.existsSync())
  await tempFile.delete();


await tempFile.create();
var ref = FirebaseStorage.instance.ref(path); 
// final DownloadTask task = ref.writeToFile(tempFile);
final DownloadTask task = ref.writeToFile(tempFile);

await task.then((value) => 
  file = tempFile
  //Also delete the temp file
  // await tempFile.delete();
);

RESULT :文件下载成功,但响应时间过长。关于如何加快下载速度的任何建议。我还使用发布 apk 测试了真实设备上的响应,但从 Firebase 存储下载速度仍然太慢。我正在使用 20MBPS 的互联网连接,因此下载数据的速度相当不错。此外,将文件上传到 Firebase 存储非常不错,我没有发现任何问题。

注意:我目前正在使用 Firebase 免费计划进行开发。这会影响下载响应吗? 这里真的需要一些专家的建议。

FIREBASE 上的图像

FIREBASE 上的视频

【问题讨论】:

什么是“相当慢”和“太多时间”?您在哪个地区运营,您的存储托管在哪个地区?此外,您是否使用某种形式的度量(可能是 speedtest.net 或类似的)测试了您的连接,以验证您确实获得了预期的吞吐量? 默认情况下,该区域是 Firebase 在创建默认存储桶时选择的区域。我忘记了我选择了哪个地区。另外,我已经测试了我的互联网连接。下载速度为 2mbps,上传速度也是如此。基本上,我正在创建一个像 9gag 这样的社交应用程序,其中包含一个包含图像/视频的帖子列表。正如您在上面看到的,图像尺寸非常小,因此下载这些图像应该很快,但下载一张图像然后继续下一张图像至少需要大约 2 秒。因此,如果我要下载 10 张图片,则大约需要 15-20 秒 即使对于只有 kbs 大小的图像,这个下载时间也非常高。如果我尝试下载视频,那么下载并显示它们最多需要一分钟。此外,firebase 存储窗口没有显示太多关于如何更改默认存储桶区域的控件,也没有显示哪个是当前区域。在发布问题之前,我已经研究了有关问题所在的任何可能的解决方案,但没有发现任何有用的东西。 有人评论说,如果你使用 FTP 服务器,那么下载速度是 Firebase 存储的 10 倍。一位评论说通过更改 firebase 存储规则来公开 firebase。我也这样做了,但响应时间是一样的。一些人评论说他们已经转向 Amazon Storage,因为它比 Firebase 存储快得多。很难接受 google 提供的平台可能会很慢。我错过了什么? 项目所在区域为 nam5 (us-central) 【参考方案1】:

我设法减少了从 Firebase 存储访问文件的下载时间。以下是我做的一些步骤:

1 - 所有 Firebase 项目基本上都是 Google Cloud 项目。不知道这一点,因为我是 Firebase 和服务器端环境的新手。 Understanding Firebase Projects

2- 我找到了一个关于从基本上是谷歌云存储桶的 firebase 存储桶快速访问的答案。 Firebase Storage very slow compared to Firebase Hosting

Zywy 发布的解决方案。除了将存储桶公开之外,他还提到您需要安装 Google Cloud SDk 才能将文件(将上传到存储桶)公开。我认为这是原生 android 开发的情况,而不是 Flutter。我没有安装 Cloud SDK。我只是将存储桶公开,然后上传到存储桶的所有文件也都是公开的。如果我在这里错了,请纠正我。

所以基本上我所做的就是默认让我的桶公开。这是有关如何执行此操作的链接: Making Data Public

将存储桶公开后,下载图像文件需要 150-200 毫秒的时间减少到 10-30 毫秒(毫秒)。

任何像我一样刚接触 Firebase 并遇到同样情况的人都应该遵循这些步骤。

另外,我还在学习 Firebase,所以如果有人有一些专家建议可以更好地回答这个问题,或者如果我对这个问题有任何误解,请让我和整个社区知道这一点。

另外,我还在寻找关于公开存储桶的安全问题。有害还是无害?因此,如果有任何云平台安全方面的专家,请告诉我们。

感谢Robert Sandberg对此问题的早期回复。

【讨论】:

【参考方案2】:

首先回答您的具体问题:不,Firebase Spark 计划不会影响下载时间。

很难为这个非常广泛的问题写出一个好的答案。但根据您在评论中提供的答案......这里是:

如果您所在的地区与美国(您的存储桶所在的地区)不同,那当然会影响下载时间。所以一个建议是确保你的存储在你拥有最多用户的区域,或者实现负载均衡。

您是否为实际下载时间加上了时间戳?缩小是否是实际下载需要时间的那部分,还是代码的其他部分?所以就在你开始实际下载之前,然后在它完成之后,不包括其他部分。这样你就可以隔离很多时间的地方。用这样的东西检查它:

final before = DateTime.now();
<... specific code that does the downloading>
final difference = DateTime.now().difference(before);

然后要考虑的另一件事是如何实现每个图像的获取。如果您知道您将下载 10 张图像。不要一个接一个地同步进行,而是考虑异步进行获取并等待最慢的时间。也许是这样的:

final allImages = await Future.wait([
  downloadImage(1),
  downloadImage(2),
  downloadImage(3),
  ...
]);

【讨论】:

以上是关于从 Firebase 存储下载文件非常慢的主要内容,如果未能解决你的问题,请参考以下文章

从多个文件上传 Firebase 存储中获取下载 url

如何从 Firebase 存储下载具有原始扩展名的文件?

如何使用firebase_admin从python中的firebase存储下载文件

如何从 Android 上的 Firebase 存储正确下载多个文件?

如何从 Vue Web 应用程序中的 Firebase 存储下载文件?

从 Firebase 存储下载并播放 .mp3 文件到内存