Khawar
Khawar

Reputation: 9241

Objective-c Check file size from URL without downloading

I need to check the size of file from a URL. I get the file size perfectly when downloading file with AFNetworking.

AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request
                                                                        success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                                                            // Success Callback

                                                                        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                                                            // Failure Callback

                                                                        }];

and get file size in another block

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {

    }];

But i need to check file size before initiating download request, so that i can prompt to user. I have also tried another method

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]);

But it blocks the UI, coz it download all data to calculate its size. Is there any way to check file size before downloading? Any help is appreciated.

Upvotes: 4

Views: 5785

Answers (2)

Hashem Aboonajmi
Hashem Aboonajmi

Reputation: 13830

here is the code:

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

Upvotes: 7

Wain
Wain

Reputation: 119021

If the server supports it you can make a request to just get the headers (HEAD, as opposed to GET) without the actual data payload and this should include the Content-Length.

If you can't do that then you need to start the download and use expectedContentLength of the NSURLResponse.


Basically, create an instance of NSMutableURLRequest and call setHTTPMethod: with the method parameter set to @"HEAD" (to replace the default which is GET). Then send that to the server as you currently request for the full set of data (same URL).

Upvotes: 22

Related Questions