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但是下载文件的数据是完美的...请告诉我如何才能获得下载文件的总长度。
答案 0 :(得分:3)
预期的内容长度由您的服务器提供,因此您的iOS应用无法控制是否提供。如果无法确定长度,您必须优雅地处理NSURLResponseUnknownLength
的值,即-1。
正如the documentation所说:
某些协议实现报告内容长度作为响应的一部分,但并非所有协议都保证提供大量数据。客户应该准备好处理更多或更少的数据。
正如Desdenova指出的那样,this question的答案指出,如果回复的expectedContentLength
为NSURLResponseUnknownLength
,则Content-Encoding
可以是gzip
。您可以通过清除请求的gzip
:
Accept-Encoding
[request setValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
注意,如果你这样做,你的响应会更大(例如,我从我的服务器下载一个小JPG的例子,gzipped有效载荷是15k,未压缩的有效载荷是25k)。对于小的响应,这种差异可能是不可观察的(但是,如果它那么小,你真的不需要进度更新),但是对于大的响应,它可能变得很重要。