Question

J'utilise NSMutableURLRequest pour télécharger une image sur un serveur web. Je pensais que mon code est stable car il fonctionne pour la majorité des utilisateurs, mais certains utilisateurs ne peuvent tout simplement pas télécharger des images. En regardant mes journaux de serveur, je vois de temps en temps

"limite manquantes dans les données multipart / form-data POST in Unknown on line 0" avertissement qui indiquerait une erreur de limitation dans la construction du corps de poste.

Voici ce que j'utilise:

request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:[method uppercaseString]];

NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data, boundary=%@", boundary];

[request setValue:contentType forHTTPHeaderField:@"Content-type"];
NSMutableData *postBody = [NSMutableData data];

// add the image
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"Content-Disposition: form-data; name=\"image_upload\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
NSData *jpegData = UIImageJPEGRepresentation(jpeg, 100);
[postBody appendData:jpegData];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// add the other POST params
keys = [postdata allKeys];
int l = [keys count];
for (int i=0; i<l; i++){
    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", [keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[postdata objectForKey:[keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    }

Je peux comprendre si le code a donné lieu à l'avertissement PHP 100% du temps, mais il se produit probablement une fois tous les 30 ou 40 utilisateurs. Si un utilisateur obtient cette erreur, son même pour une image qu'ils essaient de poste.

Quelqu'un peut-il quoi que ce soit de voir immédiatement évident, ou avez des idées pour expliquer pourquoi ce serait un problème intermittent?

Était-ce utile?

La solution 2

Il se trouve que le problème était avec cette ligne:

[request setValue:contentType forHTTPHeaderField:@"Content-type"];

Il devrait bien sûr être:

[request setValue:contentType forHTTPHeaderField:@"Content-Type"];

(note le cas). Toujours pas sûr pourquoi cela a cassé la demande pour seulement un petit nombre d'utilisateurs, cependant.

Autres conseils

champs en-tête HTTP sont insensibles à la casse, donc il ne devrait faire aucune différence si vous utilisez Content-Type, Content-type ou CONTENT-TYPE. En outre, votre réponse n'explique pas pourquoi seul un petit nombre de vos utilisateurs a eu ce problème.

J'ai une autre explication pour la limite manquante, fondée sur l'expérience réelle. Il se avère que certains fournisseurs de données cellulaires, notamment Vodafone, filtrer toutes les requêtes HTTP par procuration qui ajoutent divers en-têtes personnalisés (tels que x-up-subno, HTTP_SM_MS_CRYPTED, et d'autres). J'ai des preuves dans le monde réel que certains de ces procurations formes mangle comme multipart/form-data a enregistré, en supprimant l'attribut « limite » de l'en-tête de Content-Type, et rendant ainsi la forme non analysable pour ne importe quel serveur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top