2012-06-21 4 views
3

Здравствуйте, мне нужно создать progressView при загрузке данных с моего веб-сервиса.отклик ожидаетсяContentLength return -1

На самом деле ожидаемая длина контура всегда возвращается -1.

После того, как вы посмотрите много проблем с подобными проблемами, похоже, что мой веб-сервис никогда не отправляет Content-Length :.

Тогда я проверить с CURL и вот результат:

< HTTP/1.1 200 OK 
< Date: Thu, 21 Jun 2012 10:04:39 GMT 
< Server: Apache/2.2.16 (Debian) 
< X-Powered-By: PHP/5.3.3-7+squeeze9 
< cache-control: no-cache 
< Vary: Accept-Encoding 
< Content-Type: text/html; charset=UTF-8 
< Content-Length: 3239 
< Connection: Keep-Alive 
< Set-Cookie: PHPSESSID=u4o4i9dofdgnkfmtnf163635j6; path=/ 

и вот мой код, чтобы поймать длина

long long expectDataSize; 
long long currentDataSize; 

.... 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response 
{ 
    NSLog(@"expect content length %lld", [response expectedContentLength]); 
    expectDataSize = [response expectedContentLength]; 
    currentDataSize = 0; 
} 

Любой уже видите эту проблему?

+0

Попробуйте: 'NSLog (@ "% @", [ответ allHeaderFields]);' и видеть если объект ответа фактически имеет поле заголовка «Длина содержимого». – Alladinian

+0

Пример кода здесь http://stackoverflow.com/questions/23585432/totalbytesexpectedtowrite-is-1-in-nsurlsessiondownloadtask/33372970#33372970 –

ответ

19

Хорошо, я это исправить себя здесь моя реальная проблема и решение:

Когда я спрашиваю с Curl я не могу получить длину без проблем.

Но когда я использую NSURLConnection

NSURLConnection *c = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 

Ответ будет сжиматься с "Gzip" (не спрашивайте меня, почему). И если ответ кодируется с Gzip, невозможно узнать длину, затем «expectedContentLength» return -1. И «Content-Length» отсутствует от [response allHeaderFields].

Если вы действительно хотите, чтобы получить длину, вы можете просто заставить не использовать Gzip, как это:

[req setValue:@"" forHTTPHeaderField:@"Accept-Encoding"]; 
+0

«NSURLResponse» не обладает свойством allHeaderFields. как я могу узнать ожидаемую длину? –

+0

Я использую NSHTTPURLResponse, а не NSURLResponse –