2015-06-20 7 views
5

Aplikacja mM pobiera kilka nowych obrazów z mojego zaplecza Parse.com. Przykładowy kod:Pobieranie obrazów z witryny Parse.com i sprawdzanie obrazu nie jest uszkodzone.

//Where object is a downloaded PFObject 
PFFile *image = object[@"image"]; 
[image getDataInBackgroundWithBlock:^(NSData *data, NSError *error) { 

    if(!error) { 
     UIImage *image = [UIImage imageWithData:data]; 
     //Do more work here… 
    } 
} 

Jednak zauważyłem, że jeśli jest problem z połączeniem lub jakiś błąd ogólny obraz zostanie pobrany (bez błędów), ale obraz będzie zniekształcony z czarnych poszarpanych linii i Nie kompletny. Czy istnieje sposób sprawdzenia, czy pobrany obraz jest całkowicie nienaruszony i nie jest zniekształcony?

+0

Prawdopodobnie błąd w analizie składniowej – Alistra

+0

Zastanawiające się również, czy wystąpiły problemy z pobieraniem połowy obrazu, więc dolna połowa będzie czarna. Albo obraz wyglądałby tak, jakby miał nad nim dziwny żółty filtr. Napotkano ten problem w Parse 1.7.5 – Drenguin

Odpowiedz

0

Też mam ten problem przed, ja sprawdzam nagłówek i porównuję długość zawartości z danymi, które kończą się pobieraniem.

Jeśli serwer internetowy działa poprawnie i może zwrócić poprawną odpowiedź dla Content-Length, można go użyć do sprawdzenia danych.

Oto urywek pobrać tylko nagłówek wniosek:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; 
request.HTTPMethod = @"HEAD"; 
NSHTTPURLResponse *response; 
[NSURLConnection sendSynchronousRequest:request 
        returningResponse:&response 
           error:nil]; 

if ([response respondsToSelector:@selector(allHeaderFields)]) { 
    NSDictionary header = [response allHeaderFields]; 
    NSString *rawContentLength = [header objectForKey:@"Content-Length"]; 
    NSNumber *contentLength = [NSNumber numberWithInt:[rawContentLength intValue]]; 
    // Convert contentLength to NSUInteger and use to compare with you NSData length. 
} 

można również używać go z NSHTTPURLResponse użyć, aby pobrać obraz, aby zapisać żądanie HTTP.

Następnie należy uzyskać długość NSData. Można użyć metody:

NSUInteger dataLength = [downloadedData length]; 

następnie porównać zarówno wartość, jeśli dwie długości są równe, to go pobrać kompletny, jeszcze trzeba by ponownie pobrać.

Można również sprawdzić, czy obraz jest uszkodzony, odczytać nagłówek Content-Type i sprawdzić pierwsze i ostatnie bajty danych.

Dla PNG How to check if downloaded PNG image is corrupt? Nie zapomnij o "bajcie" do "zwęglenia", i tak zobaczysz ostrzeżenie.

Dla JPEG Catching error: Corrupt JPEG data: premature end of data segment

Nadzieja to może pomóc. :)

+0

co jednak zrobić dla Parse? – Kex

+0

Widzę, mamy ten sam problem, ale różne narzędzia. Czy możesz sprawdzić ** dane ** wewnątrz ** jeśli ** przed ** imageWithData **? W takim przypadku nadal możesz sprawdzić, czy dane obrazu są uszkodzone, czy nie, jeśli znasz typ obrazu. Jeśli obraz jest uszkodzony, możesz go ponownie pobrać ponownie. Myślę, że usunę odpowiedź na temat sprawdzania Content-Length w nagłówku, ponieważ nie działa tutaj. – spicydog