我在Firebase Storage Kotlin SDK中遇到了一个奇怪的bug。我使用putFile()
函数将图像上传到Firebase。一切似乎都很好,我能做到。然而,当我尝试测试和禁用互联网连接时,该函数不返回任何东西。我的意思是我放置了所有的UploadTask
监听器,但是它们都没有被调用。它一直在"加载"。有人遇到过类似的问题吗?
val storage = FirebaseStorage.getInstance().reference
val remoteImagePath = "images/username/imageName.jpg"
val imageRef = storage.child(remoteImagePath)
val result = imageRef.putFile(image)
result.addOnSuccessListener {
Log.d("ViewModel", "Success!")
}.addOnFailureListener { error ->
Log.d("ViewModel", "${error.message}")
}.addOnCompleteListener{
Log.d("ViewModel", "Completed!")
}
然而,当我尝试测试和禁用互联网连接时,该函数不返回任何东西。
这是预期的行为,因为您禁用了设备上的互联网连接。如果设备未连接到互联网,则无法将图像上传到云存储。
但是,Firebase SDK for Cloud Storage支持恢复上传。这意味着一旦你在线时开始上传文件,你可以稍后恢复它。因此,为了能够恢复一个特定文件的上传操作,你必须至少在上传开始之前在线,并且你可以调用UploadTask.TaskSnapshot#getUploadSessionUri()来获取"uploadSessionUri"的值。这个URI的有效期大约是一周,以后可以通过将值传递给StorageReference#putFile(URI, StorageMetadata, URI)方法来恢复上传。没有它,您无法恢复任何上传。如果您需要该URI对象在应用程序重新启动时持久化,那么您可以将该对象保存在持久存储中,例如SharedPreferences,或者更好地保存在Data Store中。
因此,如果您离线并且没有设法获得会话URI,那么您无法恢复上传。没有自动重试的机制。
我的意思是我已经放置了所有的UploadTask侦听器,但它们都没有被调用。
正如您已经注意到的,StorageReference#putFile(uri: uri)方法返回的对象类型是UploadTask。因此,您可以附加一个侦听器,以查看操作何时完成或以异常失败。在大多数情况下,当存储服务器由于不适当的安全规则而拒绝操作时,调用onFailure。