Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find size of a file before downloading it in iOS 7?

Wanted to find size of a file on some server before downloading it in iOS 7... I have a method of NSURLConnectionDelegate but it is deprecated after iOS 4.3

Here was that method:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
like image 689
asadullah07 Avatar asked Oct 11 '13 10:10

asadullah07


4 Answers

Make a request using the HEAD method. For example:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];

This request will be identical to a GET but it won't return the body. Then call

long long size = [response expectedContentLength];

Complete example with NSURLConnection (works for NSURLSession too of course):

NSURL *URL = [NSURL URLWithString:@"http://www.google.com"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error: nil];
long long size = [response expectedContentLength];
NSLog(@"%lld",size);

This is also useful to conditionally download based on the Last-Modified header (assuming that the server sends you that).

if ([response respondsToSelector:@selector(allHeaderFields)]) {
    NSString *lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"];
}
like image 198
Jano Avatar answered Nov 25 '22 03:11

Jano


You should instead use the NSURLConnectionDataDelegate Note: DATADelegate

and its didReceiveResponse: method to send a HEAD request to get just the header:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

Then you can get the response size with @Port's suggestion:

long long size = [response expectedContentLength];
like image 44
James Webster Avatar answered Nov 25 '22 04:11

James Webster


you can use this method,NSURLResponse object which is passed to the following delegate methods:

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

}
-(NSURLRequest *)connection:(NSURLConnection *)connection
        willSendRequest:(NSURLRequest *)request
       redirectResponse:(NSURLResponse *)response {
}

try like this..

long long size = [response expectedContentLength];
like image 33
Sport Avatar answered Nov 25 '22 04:11

Sport


For Swift use these steps,

Step 1: Use NSURLConnectionDataDelegate.

class ViewController: UIViewController,NSURLConnectionDataDelegate {

Step 2: Create request for connection.

var request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "http://www.twitter.com")!)

// Use **HEAD** request to get http header information.

request.HTTPMethod = "HEAD"

Step 3: Create connection.

var connection:NSURLConnection = NSURLConnection(request: request, delegate: self)!

Step 4: Use delegate method of NSURLConnectionDataDelegate

func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse)
{
    var size = response.expectedContentLength
    println("size : \(size)")
}

Here is full code...

import UIKit

class ViewController: UIViewController,NSURLConnectionDataDelegate {

override func viewDidLoad() {
    super.viewDidLoad()


    var request:NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: "http://www.twitter.com")!)
    request.HTTPMethod = "HEAD"

    var connection:NSURLConnection = NSURLConnection(request: request, delegate: self)!

}

func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse)
{
    var size = response.expectedContentLength
    println("size : \(size)")
}
}
like image 34
Mohammad Zaid Pathan Avatar answered Nov 25 '22 03:11

Mohammad Zaid Pathan