无法获得下载文件的总长度

时间:2014-03-12 12:49:47

标签: ios iphone ios7 nsurlconnection

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但是下载文件的数据是完美的...请告诉我如何才能获得下载文件的总长度。

1 个答案:

答案 0 :(得分:3)

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

正如the documentation所说:

  

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


正如Desdenova指出的那样,this question的答案指出,如果回复的expectedContentLengthNSURLResponseUnknownLength,则Content-Encoding可以是gzip。您可以通过清除请求的gzip

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

注意,如果你这样做,你的响应会更大(例如,我从我的服务器下载一个小JPG的例子,gzipped有效载荷是15k,未压缩的有效载荷是25k)。对于小的响应,这种差异可能是不可观察的(但是,如果它那么小,你真的不需要进度更新),但是对于大的响应,它可能变得很重要。