Frage

Ich verwende NSMutableURLRequest ein Bild auf einen Webserver hochladen. Ich dachte, mein Code stabil war, wie es für die Mehrheit der Nutzer arbeitet, aber einige Benutzer können einfach keine Bilder hochladen. Ein Blick auf meine Server-Logs, sehe ich die gelegentliche

"Missing Grenze in multipart / form-data POST-Daten in Unknown on line 0" Warnung, die bei der Konstruktion des Post Körper auf einen Begrenzungsfehler hinweisen würde.

Im Folgenden finden Sie, was ich bin mit:

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]];
    }

Ich kann verstehen, wenn der Code in Folge der PHP-Warnung 100% der Zeit, aber es tritt wahrscheinlich einmal alle 30 oder 40 Benutzer. Wenn ein Benutzer erhält diesen Fehler, seine das gleiche für jedes Bild, das sie zu senden versuchen.

Kann jemand etwas sieht sofort offensichtlich, oder haben keine Erkenntnisse darüber, warum dies ein vorübergehendes Problem sein würde?

War es hilfreich?

Lösung 2

Stellt sich heraus, das Problem war mit dieser Zeile:

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

Es sollte selbstverständlich sein:

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

(Anmerkung der Fall ist). Immer noch nicht sicher, warum brach dieser die Anfrage nur für eine kleine Anzahl von Benutzern, though.

Andere Tipps

HTTP-Header-Felder sind Groß- und Kleinschreibung, so dass es keinen Unterschied machen sollte, ob Sie verwenden Content-Type, Content-type oder CONTENT-TYPE. Auch Ihre Antwort erklärt nicht, warum nur eine kleine Anzahl der Benutzer dieses Problem hatte.

Ich habe eine andere Erklärung für die fehlende Grenze, eine basierend auf tatsächlichen Erfahrungen. Es stellt sich heraus, dass einige Handy-Daten-Provider, insbesondere Vodafone, filtern alle HTTP-Anfragen durch Proxys, die verschiedene benutzerdefinierte Header (wie x-up-subno, HTTP_SM_MS_CRYPTED und andere) hinzufügen. Ich habe reale Hinweise darauf, dass einige dieser Proxies mangle Formen als multipart/form-data POSTed, die „Grenze“ Attribut des Content-Type Header zu entfernen, und wodurch die Form unparsable für fast jeden Server.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top