Objective-c从URL检查文件大小而不下载

时间:2013-10-28 10:20:15

标签: ios objective-c

我需要从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]);

但它会阻止用户界面,因为它会下载所有数据以计算其大小。 在下载之前有没有办法检查文件大小?任何帮助表示赞赏。

2 个答案:

答案 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);
                     }];