Lors du téléchargement d'un fichier, je souhaite pouvoir reprendre le téléchargement. Par exemple:NSURLResponse renvoie Content-Range, en ignorant la plage que j'ai demandée
NSFileManager *fm = [NSFileManager defaultManager];
NSString *downloadTempPath = [_tempPath path];
if ([fm fileExistsAtPath:downloadTempPath]) {
// We have a partial download. Get the rest of the file starting at byteCount
NSDictionary *dAttrib = [fm attributesOfItemAtPath:downloadTempPath error:nil];
NSUInteger byteCount = [dAttrib fileSize];
NSLog(@"Preparing to resume download: %@", downloadTempPath);
NSString *requestRange = [NSString stringWithFormat:@"bytes=%d-", byteCount];
[self.request setValue:requestRange forHTTPHeaderField:@"Range"];
}
Cela produira une demande d'obtenir avec un en-tête comme ceci:
Gamme: octets = 1000-
j'attendre la première 206 réponse à me donner un morceau où je lui ai demandé de commencer, ayant un en-tête et une valeur comme celle-ci (jeté de allHeaderFields
):
"Content-Range" = "octets 1000-340197/340198";
Mais parfois, il saute avant et retourne quelque chose comme ceci:
"Content-Range" = "octets 32000-340197/340198";
Ce qui est vraiment mauvais, parce que j'ai besoin de ces octets de 1000-32000, et il ne me les a pas donnés.
Je sais qu'il n'y a aucune erreur de serveur, parce que quand je boucle sur le serveur il renvoie la section que j'ai demandée. En outre, quand j'utilise wireshark, je ne vois aucun paquet allant au serveur. Donc, c'est un problème du côté iOS, peut-être avec le NSURLCache
J'ai fait face à un problème similaire sur iOS 8.1.2. La requête ne contenait aucun en-tête 'Range' ou' If-Range', mais la réponse renvoyait un contenu partiel avec l'en-tête 'Content-Range'. J'ai corrigé ceci en supprimant entièrement l'utilisation du cache avec la stratégie de cache 'NSURLRequestReloadIgnoringLocalCacheData'. – Yan