2015-07-31 5 views
0

Я не мог найти решение, которое сработало для меня. Но мне нужно получить размер файла видео, которое я загружаю, чтобы я мог убедиться, что у пользователя достаточно места на телефоне для него.iOS получить размер файла перед загрузкой

Мои мысли - проверить размер видео, тогда, если у пользователя есть место для него, я бы его загрузил. Любые рекомендации?

NSURL *url = [NSURL URLWithString:stringURL]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
NSURLSession *session = [NSURLSession sharedSession]; 

NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {...}]; 
+0

См. Http://stackoverflow.com/questions/19315533/how-to-find-size-of-a-file-before-downloading-it-in-ios-7 –

ответ

-1

Используйте эту функцию, чтобы получить удаленный размер URL. Обратите внимание, эта функция является синхронным и будет блокировать поток, так называют его из потока, отличного от основного потока:

extension NSURL { 
    var remoteSize: Int64 { 
     var contentLength: Int64 = NSURLSessionTransferSizeUnknown 
     let request = NSMutableURLRequest(URL: self, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30.0); 
     request.HTTPMethod = "HEAD"; 
     request.timeoutInterval = 5; 
     let group = dispatch_group_create() 
     dispatch_group_enter(group) 
     NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
      contentLength = response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown 
      dispatch_group_leave(group) 
     }).resume() 
     dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, Int64(5 * NSEC_PER_SEC))) 
     return contentLength 
    } 
} 

затем вызвать переменную remoteSize везде вам нужно, на нить отличается от основного потока:

let size = url.remoteSize 
+0

Я получаю размер -1 .. –

+0

@RayKing увеличивает таймаут, это 5 второй теперь, вы можете увеличить его столько, сколько вам нужно – Mousavian

+0

вот так? DispatchQueue.main.asyncAfter (крайний срок: .now() + 15) { print (NSURL (файлURLWithPath: track.url!). RemoteSize) } С этим все еще получается - 1 –

-1

СВИФТ 3:

extension NSURL { 
    var remoteSize: Int64 { 
     var contentLength: Int64 = NSURLSessionTransferSizeUnknown 
     let request = NSMutableURLRequest(url: self as URL, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30.0); 
     request.httpMethod = "HEAD"; 
     request.timeoutInterval = 5; 
     let group = DispatchGroup() 
     group.enter() 
     URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in 
      contentLength = response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown 
      group.leave() 
     }).resume() 

     return contentLength 
    } 
} 
-1

Swift 3: Поскольку вы звоните dataTask у ou не может использовать значение вне блока, поэтому используйте его таким образом.

var contentLength: Int64 = NSURLSessionTransferSizeUnknown 
       let request = NSMutableURLRequest(url: url as URL, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30.0); 
       request.httpMethod = "HEAD"; 
       request.timeoutInterval = 5; 
       let group = DispatchGroup() 
       group.enter() 
       URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in 
        contentLength = response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown 
//Here you should use the value 
        print("contentLength",contentLength) 
        group.leave() 
       }).resume() 
0

Вот вариант из других ответов, которые используют функцию (в Swift 4), чтобы вызвать замыкание, когда размер извлекается:

func getDownloadSize(url: URL, completion: @escaping (Int64, Error?) -> Void) { 
    let timeoutInterval = 5.0 
    var request = URLRequest(url: url, 
          cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, 
          timeoutInterval: timeoutInterval) 
    request.httpMethod = "HEAD" 
    URLSession.shared.dataTask(with: request) { (data, response, error) in 
     let contentLength = response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown 
     completion(contentLength, error) 
    }.resume() 
} 

Вот как эта функция может быть использована:

let url = URL(string: "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png")! 
getDownloadSize(url: url, completion: { (size, error) in 
    if error != nil { 
     print("An error occurred when retrieving the download size: \(error.localizedDescription)") 
    } else { 
     print("The download size is \(size).") 
    } 
}) 
Смежные вопросы