【问题标题】:Can't get the total length of downloading file无法获取下载文件的总长度
【发布时间】:2014-04-16 14:56:39
【问题描述】:
NSMutableURLRequest *objRequest =[[NSMutableURLRequest alloc]initWithURL:url1];

[objRequest setHTTPMethod:@"POST"];
[objRequest setHTTPBody:[NSData dataWithBytes:(__bridge const void *)(dict) length:[dict count]]];

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:url1] 
                                                             delegate:self];
[connection start];


-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    length = [response expectedContentLength];
    NSLog(@"%f",length);
}

我在didReceiveResponse 方法中得到长度-1,但下载文件的数据是完美的...请告诉我如何获得要下载的文件的总长度..

【问题讨论】:

  • 无关,但不要打电话给[connection start]initWithRequest:delegate: 已经开始您的连接。
  • 尝试在didReceiveData:中查找数据长度
  • 试试这个,看起来很有希望stackoverflow.com/questions/11136020/…
  • @Desdenova 不错。我注意到这使我可以在我的请求中使用expectedContentLength,而我以前得到的是-1,但我也注意到(在Charles 中观看请求和响应)当我的响应不是gzip 时,我失去了压缩,不出所料,响应要大得多。对于大型下载,这可能会对性能/带宽产生重大影响。

标签: ios iphone ios7 nsurlconnection


【解决方案1】:

预期内容长度由您的服务器提供,因此您的 iOS 应用无法控制是否提供。如果长度无法确定,您必须优雅地处理 NSURLResponseUnknownLength 的值,即 -1。

正如the documentation 所说:

一些协议实现将内容长度报告为响应的一部分,但并非所有协议都保证传送该数量的数据。客户应该准备好处理更多或更少的数据。


正如 Desdenova 所指出的,this question 的答案指出,如果响应的 Content-EncodinggzipexpectedContentLength 可以是 NSURLResponseUnknownLength。您可以通过清除请求的Accept-Encoding 来禁用gzip

[request setValue:@"" forHTTPHeaderField:@"Accept-Encoding"];

注意,如果您这样做,您的响应会更大(例如,在我从服务器下载的小型 JPG 示例中,gzip 压缩的有效负载为 15k,未压缩的有效负载为 25k)。对于小的响应,这种差异可能无法观察到(但是,同样,如果它那么小,您实际上并不需要更新进度),但对于大响应,它可能会变得很重要。

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2011-12-02
    相关资源
    最近更新 更多