gpt4 book ai didi

objective-c - NSURLErrorDomain : Cannot decode raw data

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:56 26 4
gpt4 key购买 nike

我正在使用我自己的下载管理器下载一些文件。它运行了将近半年(甚至在将其发布到 App Store 之后)
但是昨天我得到了一些有趣的东西:

Error Domain=NSURLErrorDomain Code=-1015 "cannot decode raw data"
UserInfo=0x4c12e0
{
NSErrorFailingURLStringKey=http://***/file.json.gz,
NSErrorFailingURLKey=http://***/file.json.gz,
NSLocalizedDescription=cannot decode raw data
NSUnderlyingError=0x4dcec0 "cannot decode raw data"
}

一些背景知识:我有一个网络服务器,它为我提供 JSON 和 gzip 压缩的 JSON。

因此,当我尝试下载 gzip 压缩文件并且仅在 iPod Touch 4G (5.1.1) 上时出现问题!

发生了什么事?我该如何处理?是网络服务器问题吗?

最佳答案

接下来就是问题了。
当 iPhone 收到 gzip 数据时,它会自动解压缩。 Content-Length 在这种情况下等于 -1。因此,如果您想继续下载 gzip 数据,制作 Range header 不是一个好主意:您不知道 gzip 数据的大小。
在我们的例子中,我们让 Range 的开始等于已经下载的数据,在某些情况下它超过了 gzip 数据的大小(我什至没有说这是错误的,文件已损坏!)。所以 Web 服务器返回 416 Requested Range not satisfiable 这就是为什么 NSURLConnection 委托(delegate)的 didFailWithError 方法被调用时出现 NSURLErrorCannotDecodeRawData 错误.

详细解释和我们的解决方案

在下载管理器中我们有代码

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
[req setRange:NSMakeRange(progress, NSNotFound)];

其中 progress 是下载的数据量。它存储在数据库中以允许暂停和继续下载单个文件(例如,应用程序重新启动之间的大文件)。当我们想继续时,我们将 Range header 设置为 [progress; ∞) 间隔(从我们已经下载的偏移量接收数据)。

服务器(Apache、nginx 等)即时对流应用 gzip 编码。这有利于减小输出文件的大小,但结果是您不知道整个 gzip 文件的大小。所以它基本上意味着你不能暂停和继续下载 gzip 流。此外,下载的 gzip 数据 block 在接收时被解压缩(NSURLConnection 委托(delegate)方法 connection:didReceiveData:),因此您不知道传递了多少 gzip 数据。因此,您不会创建正确的偏移量,并且服务器将从您不想要的偏移量返回数据,并且您生成的文件首先将被损坏,然后,一旦您超过内容长度并收到 416

因此没有任何浏览器或任何浏览器允许您继续下载动态(根据请求生成)或 gzip 压缩的内容。如果您想暂停并继续大型压缩文件(在我们的例子中为 20 Mb JSON),要么将它们设为静态并存档,要么继续对它们进行 gzip 压缩,只希望用户等到文件下载完毕。

所以我们选择了第二条路径,如果 Content-Lenght 未知 (-1),现在不设置范围。

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];

if (urlResponse.expectedContentLength != NSURLResponseUnknownLength) {
[req setRange:NSMakeRange(progress, NSNotFound)];
}

关于objective-c - NSURLErrorDomain : Cannot decode raw data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11458107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com