4

J'ai un problème avec requête HTTP PUT et demande corps comme flux à partir du fichier.NSMutableURLRequest et "requête corps flux épuisé" erreur

Quelle que soit la taille du fichier i obtenir erreur « flux de corps de la demande NSURLErrorDomain -1021 épuisé »

Je sais que je peux passer outre ce problème en mettant en œuvre la méthode:

-(NSInputStream*)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request 

mais cette approche n'est pas bon car il va télécharger à nouveau le fichier entier, et 40 Mo de fichier s'avère être 80 Mo de transfert de données.

Si je prends le même fichier que NSData et que je configure le corps de la requête, cela fonctionne correctement.

J'ai essayé d'envoyer la requête Async et de synchroniser le même résultat dans les deux.

Voici mon code, simple et similaire à l'exemple d'Apple:

NSURL *url = [NSURL URLWithString:[self concatenatedURLWithPath:path]]; 
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url]; 
[req setHTTPMethod:@"PUT"]; 
[req setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
[request setTimeoutInterval:DEFAULT_TIMEOUT]; 
[req setValue:_contentType forHTTPHeaderField:@"Content-Type"]; 
NSInputStream *fileStream = [NSInputStream inputStreamWithFileAtPath:_dataStreamLocation]; 

[req setHTTPBodyStream:fileStream]; 
_connection = [[NSURLConnection connectionWithRequest:req delegate:self] retain]; 

Est-ce que je fais quelque chose de mal? Ai-je raté quelque chose?

Répondre

1

Je rencontrais ce même problème, ce qui me convenait était de conserver le flux puis de le libérer à la fin de la transaction HTTP asynchrone. Cela ne semble pas être nécessaire, mais cela m'a permis de contourner le problème.

+1

Cela a-t-il vraiment fonctionné pour vous ....? Je suis également confronté au même problème. – Selvin

+0

pouvez-vous poster un code pour expliquer comment vous avez fait cela? – d2burke

1

Cette solution fonctionne pour moi:

[request setTimeoutInterval:240]; 
2

Des regards de celui-ci, il semble que vous n'êtes pas mise en @ « Content-Length » dans l'en-tête.

La façon dont je le fais est comme ceci:

NSUInteger fileSize = [[[[NSFileManager defaultManager] attributesOfItemAtPath:_dataStreamLocation error:nil] objectForKey:NSFileSize] unsignedIntegerValue]; 
[request setValue:[NSString stringWithFormat:@"%u", fileSize] forHTTPHeaderField:@"Content-Length"]; 

De toute façon, je faisais des lots et ajout de temps en temps eu l'erreur d'épuisement du flux de corps. D'après ce que je pouvais dire, le problème était que je n'avais que peu d'espace libre sur l'appareil, et les fichiers temporaires seraient automatiquement supprimés avant la fin de certains téléchargements (lorsque je recevais l'erreur testée pour vérifier si le fichier était toujours là, ce n'était pas).