【发布时间】:2016-12-28 04:23:24
【问题描述】:
故事
我在我的应用中使用 Firebase 存储将大文件上传到 Firebase 存储。文件大多是视频,有时甚至会超过 2 GB。
我做了什么
这就是我所做的。
UploadTask originalUpload = originalDestination.putFile(Uri.fromFile(originalSource));
mCurrentUploadTask = originalUpload;
originalUpload.addOnProgressListener(mOnProgressUpdateListener);
originalUpload.addOnSuccessListener(mOriginalSuccessListener);
只是通知一下,我还将这些同步任务转换为异步,因为我需要在后台处理所有内容,
Tasks.await(originalUpload);
问题
这个问题很奇怪而且出乎意料。上传/下载完美,但速度很慢。
我在 1 MBps 的良好互联网连接上,但这些文件从未以这种速度传输。它大约是 100-150 KBps,几乎是我网络可用速度的 15%。
在提出此声明之前,我已经在多个不同的网络上进行了多次测试。无处可去,我发现 Firebase 充分利用了可用带宽,而其他非 Firebase 下载/上传则全速运行。
我的应用需要下载和上传大文件,因此无法承受如此慢的传输速度。 Firebase 完全没有预料到这一点。
如果我在实施中做错了什么,或者这是 Firebase 的固有问题,请告诉我?
更新
我也遇到了仅上传的问题。当我下载某些东西并且我只是关闭了 Wifi 时,下载会因为这个错误而被取消。
com.google.firebase.storage.StorageException: An unknown error occurred, please check the HTTP result code and inner exception for server response.
Read error: ssl=0xb7e7a510: I/O error during system call, Connection timed out
javax.net.ssl.SSLException: Read error: ssl=0xb7e7a510: I/O error during system call, Connection timed out
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:699)
at com.android.okio.Okio$2.read(Okio.java:113)
at com.android.okio.RealBufferedSource.read(RealBufferedSource.java:48)
at com.android.okhttp.internal.http.HttpConnection$FixedLengthSource.read(HttpConnection.java:446)
at com.android.okio.RealBufferedSource$1.read(RealBufferedSource.java:168)
at java.io.InputStream.read(InputStream.java:162)
at com.google.firebase.storage.FileDownloadTask.run(Unknown Source)
at com.google.firebase.storage.StorageTask$5.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
但是当我对上传执行完全相同的操作时,它只是等待连接,如果我再次打开 Wifi,它会重新连接并恢复。为什么问题只发生在下载文件时? 又是 getFile() API 的问题吗?
仅供参考,我没有更改上传和下载的超时设置。它们处于默认状态。
【问题讨论】:
-
对于下载,您是否尝试过直接使用 DownloadUrl 而不是使用 Stream/FileDownloadTask?这样更好吗?
-
videos which can be even larger than 2 GB some times- 天啊。为什么选择 Firebase?尝试使用一些 FTP 服务器。 -
@BenjaminWulfe 问题不仅在于下载,还在于上传和下载。怎么解决?
-
@ReazMurshed 我几乎使用了 Firebase 提供的所有服务,这就是我选择使用 Firebase 存储的原因。它还得到 Google Cloud Storage 的支持,因此我可以享受它提供的所有好处。为什么我不应该将 Firebase 存储用于大文件?缺点是什么?
-
Firebase 通过客户端编码提供服务器端实现以及其他一些非凡的功能。现在,如果您必须编写自己的服务器端服务,您可能会考虑使用某些 FTP 服务器上传大文件,对吧? Firebase 拥有一个带有客户端应用程序的 websocket,这也有点昂贵。但无论如何,它的效果很好。
标签: android firebase firebase-storage