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

前端 未结 7 1686
天涯浪人
天涯浪人 2020-12-02 00:43

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

相关标签:
7条回答
  • 2020-12-02 01:02

    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];
    
    0 讨论(0)
  • 2020-12-02 01:04

    try this will help . . . . .

    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse
                                                                          *)response
    {
        NSHTTPURLResponse * pHttpUrlResponse = (NSHTTPURLResponse *) response;
    
        if ([response respondsToSelector:@selector(allHeaderFields)])
        {
            NSString * fileLength = [NSString stringWithFormat:@"%lld",[pHttpUrlResponse expectedContentLength]];
        }    
    }
    

    happy coding :)

    0 讨论(0)
  • 2020-12-02 01:07

    Try this,

    NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:URL error:&attributesError];
    NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
    long long fileSize = [fileSizeNumber longLongValue];
    

    :)

    0 讨论(0)
  • 2020-12-02 01:12

    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"];
    }
    
    0 讨论(0)
  • 2020-12-02 01:12

    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];
    
    0 讨论(0)
  • 2020-12-02 01:20

    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)")
    }
    }
    
    0 讨论(0)
提交回复
热议问题