我需要从URL检查文件的大小。使用AFNetworking下载文件时,我可以完美地获得文件大小。
AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// Success Callback
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// Failure Callback
}];
并在另一个块中获取文件大小
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
}];
但我需要在启动下载请求之前检查文件大小,以便我可以提示用户。我还尝试了另一种方法
NSURL *url = [NSURL URLWithString:@"http://lasp.colorado.edu/home/wp-content/uploads/2011/03/suncombo1.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSLog(@"original = %d", [data length]);
但它会阻止用户界面,因为它会下载所有数据以计算其大小。 在下载之前有没有办法检查文件大小?任何帮助表示赞赏。
答案 0 :(得分:21)
如果服务器支持它,您可以请求只获取标题(HEAD
而不是GET
),而不包含实际数据有效负载,这应包括Content-Length
。
如果您不能这样做,则需要开始下载并使用expectedContentLength
的{{1}}。
基本上,创建NSURLResponse
的实例,并在NSMutableURLRequest
参数设置为setHTTPMethod:
的情况下调用method
(以替换默认值@"HEAD"
)。然后在您当前请求提供完整数据集(相同的URL)时将其发送到服务器。
答案 1 :(得分:6)
这是代码:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:candidateURL];
[request setHTTPMethod:@"HEAD"];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"Content-lent: %lld", [operation.response expectedContentLength]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];