使用Dart http包上传Google Drive时Bad file descriptor错误排查
Dart http包调用Google Drive可恢复上传出现
Bad file descriptor错误的排查 我在使用Dart的http包调用Google Drive API执行可恢复上传时,部分线上用户遇到了奇怪的Bad file descriptor错误,无法复现该问题,希望了解错误含义以排查原因。
我严格按照Google Drive官方文档执行文件更新流程:
- 先向
https://www.googleapis.com/upload/drive/v3/files/<some file ID>?uploadType=resumable发送PATCH请求获取上传URI,请求体为空JSON字典({}),并设置必要请求头:X-Upload-Content-Type设为文件MIME类型,X-Upload-Content-Length设为文件字节大小,Content-Type设为application/json; charset=UTF-8,Content-Length设为空JSON体的大小,此步骤始终成功。 - 从响应的
location头中获取上传URI(格式类似https://www.googleapis.com/upload/drive/v3/files/<some file ID>?uploadType=resumable&upload_id=<a long string>) - 向该URI发送PUT请求,请求体为文件字节,
Content-Length设为文件长度
该流程在本地及多数用户处正常,但部分用户在最后一步(PUT请求)报错,错误信息仅为Bad file descriptor。
已验证文件与MIME类型匹配(涉及text/plain和application/gzip两种类型,均出现该错误),测试场景下完全符合要求。线上用户的唯一变量是文件内容,报错时GZIP文件的前几个字节完全符合GZIP成员规范,文件有效。
更新
最终确认这是Dart http包的问题,与Google Drive无关。该错误多在连接断开或设备锁屏时触发,主要影响iOS用户(部分Android用户也会遇到)。Bad file descriptor通常表示尝试访问不存在或无权限的资源,推测是上传过程中设备锁屏等情况导致包失去文件访问权限。
iOS端的可行解决办法是使用cupertino_http客户端替代默认实现,配置方法参考http包文档说明。
内容的提问来源于stack exchange,提问作者James Allen
相关产品推荐
相关产品推荐

