iOS Firebase Storage上传Zip文件时触发Unknown Error(错误码40/Message too long)且重试多次才成功的问题求助
iOS Firebase Storage上传Zip文件时触发Unknown Error(错误码40/Message too long)且重试多次才成功的问题求助
我正在开发iOS应用,需要把Documents目录下的Zip文件上传到Firebase Storage,目前遇到了一个很诡异的问题,想请教下大家。
问题场景与核心代码
我先创建了Storage引用,然后调用putFile方法发起上传:
let storageReference = ORBFirestore.getStorage() .reference(withPath: "users/") .child("\(userId)/\(sensorZippedFolder.lastPathComponent)") let uploadTask = storageReference.putFile(from: sensorZippedFolder, metadata: self.remoteStorageMetaData)
待上传的Zip文件路径是:file:///var/mobile/Containers/Data/Application/861A23DF-EF32-4458-AA9D-C3F94BB1A4F8/Documents/Session_AmOH6ME627mVbOeIdVIT.zip
观察上传进度时,能看到进度条走到100%,但紧接着就抛出了错误,上传失败。
错误详情
收到的错误信息如下,核心是FirebaseStorage.StorageError.unknown,附带的底层错误提示是Message too long,错误码为40:
Failed to upload zip to remote storage: FirebaseStorage.StorageError.unknown(message: "Unexpected 40 code from backend", serverError: ["NSErrorPeerAddressKey": <1c1e01bb 00000000 2a001450 400b0c02 00000000 0000005f 00000000>, "_NSURLErrorRelatedURLSessionTaskErrorKey": <__NSArrayI 0x10fe5e020>( BackgroundUploadTask .<1>, LocalUploadTask .<1> ) , "_kCFStreamErrorCodeKey": 40, "_NSURLErrorFailingURLSessionTaskErrorKey": BackgroundUploadTask .<1>, "_kCFStreamErrorDomainKey": 1, "ResponseErrorDomain": "NSPOSIXErrorDomain", "ResponseErrorCode": 40, "bucket": "orb-storage-01-dev-us", "NSUnderlyingError": Error Domain=NSPOSIXErrorDomain Code=40 "Message too long" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=BackgroundUploadTask .<1>, _kCFStreamErrorDomainKey=1, NSErrorPeerAddressKey={length = 28, bytes = 0x1c1e01bb 00000000 2a001450 400b0c02 ... 0000005f 00000000 }, _kCFStreamErrorCodeKey=40, _NSURLErrorRelatedURLSessionTaskErrorKey=( "BackgroundUploadTask .<1>", "LocalUploadTask .<1>" )}}, "object": "users/IeQFdqCmT9Xncfo2zNf2iugd7Yp2/Session_AmOH6ME627mVbOeIdVIT.zip"])
已尝试的解决方法
我已经试过以下几种方案,但都没能彻底解决问题:
- 强制将上传操作放在主线程执行
- 将Zip文件移动或复制到其他目录后再发起上传
- 改用
putData方法替代putFile上传
目前唯一能"解决"的方式是反复重试上传,试个几次之后偶尔能成功,但这个方式显然不适合线上环境。
我的疑问
- 这里的
Message too long错误具体指什么?是请求头过长?还是文件本身的问题? - 为什么错误会随机出现,重试多次后又能成功?
- 有没有稳定的解决办法能避免这个问题?
非常感谢大家的帮助!
内容来源于stack exchange
相关产品推荐
相关产品推荐

