2015-05-23 1 views
0

У меня проблема, я хочу получить размер файла моей ссылки, который я ввел в свое текстовое поле, и покажу его на ярлыке перед началом загрузки. Я сделал несколько вещей, и я с [operation.response expectedContentLength] я просто получить 0. мой код в .m файл состоит в следующем:Получение размера файла перед его загрузкой с помощью afnetworking

NSString *fileName = [self.linkTextBox.stringValue lastPathComponent]; 

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[self.linkTextBox stringValue]]]; 
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    NSLog(@"size :%lld", [operation.response expectedContentLength]); 
    self.detailText.stringValue = [NSString stringWithFormat:@"%lld", [operation.response expectedContentLength]]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName]; 
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 
     [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 
     NSLog(@"bytesRead: %lu, totalBytesRead: %lld, totalBytesExpectedToRead: %lld", (unsigned long)bytesRead, totalBytesRead, totalBytesExpectedToRead); 
}]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
      NSLog(@"Successfully downloaded file to %@", path); 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      NSLog(@"Error: %@", error); 
     }]; 

     [operation start]; 
+0

ask webdeveloper, чтобы дать вам размер ... вы не можете получить размер без скачивания –

+1

Ожидаемая длина может быть 0, потому что сервер не предоставляет вам заголовок Content-Length. Проверьте ответ HTTP, чтобы узнать, доступно ли оно или нет. –

+0

Я получаю общую длину, когда я запускаю загрузку, но ее недоступно до начала. моя длина ссылки отображается в другом менеджере загрузки, но не моя – Armin

ответ

0

Вы не можете получить длину, прежде чем скачать, но вы можете получить его как как только вы начнете получать ответ.

Вы хотите использовать setDownloadProgressBlock:, что является методом суперкласса AFHTTPRequestOperation, который является AFURLConnectionOperation. Обратный вызов имеет три параметра, третий из которых - totalBytesExpectedToRead.

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 
    if (totalBytesExpectedToRead > 0) { 
     // Do stuff... 
    } 
}]; 

Как уже отмечалось, это значение может быть равно 0, если сервер не установлен заголовок длины содержимого в ответ HTTP, поэтому, пожалуйста, справиться с этим дело.

1

Вы можете отправить запрос HEAD вместо GET, это потребует, чтобы сервер отправил вам только заголовки для вашего запроса. Большинство серверов поддерживают это и предпочтительный метод, когда вы хотите получить некоторую информацию о метаданных о сущности, которую вы запрашиваете, без необходимости ее загрузки.

HEAD запроса может быть достигнут путем создания NSMutableURLRequest и установок HTTPMethod свойства, что-то вроде этого:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:anURL]; 
request.HTTPMethod = @"HEAD"; 
// the rest of the code 

Это если предположить, что разработчик сервера сделал свою работу, и он ожидает HEAD запросов и заполнения соответствующего http заголовков.

+0

Спасибо за ваш ответ, но теперь я не понимаю, что это решение, которое вы предоставляете, это тип пустоты, и я действительно не знаю, как я должен установить свой ярлык, чтобы показать *запрос. – Armin

+0

Я думаю, что неправильно понял ваш вопрос, я предположил, что вы не хотите загружать файл. Решение @ i_am_jorf должно работать лучше для вас, если, как он и другой заявили, HTTP-заголовок 'Content-Length' правильно отправляет сервер. – Cristik