Domanda

sto usando NSMutableURLRequest per caricare un'immagine su un server web. Ho pensato che il mio codice è stabile come funziona per la maggior parte degli utenti, ma alcuni utenti semplicemente non può caricare le immagini. Guardando i miei log del server, vedo l'occasionale

"Missing confine nei dati multipart / form-data POST in Unknown on line 0" avvertimento che puntare ad un boundary error nella costruzione del corpo palo.

Di seguito è quello che sto usando:

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

posso capire se il codice ha portato alla PHP avvertimento al 100% del tempo, ma probabilmente si verifica una volta ogni 30 o 40 utenti. Se un utente ottiene questo errore, il suo lo stesso per qualsiasi immagine cercano di posta.

Qualcuno può vedere nulla immediatamente evidente, o in caso di intuizioni sul perché questo sarebbe un problema intermittente?

È stato utile?

Soluzione 2

Si scopre che il problema era con questa linea:

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

E ', naturalmente, dovrebbe essere:

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

(nota il caso). Ancora non è sicuro perché questo ha rotto la richiesta solo per un piccolo numero di utenti, però.

Altri suggerimenti

campi

??HTTP intestazione sono case-insensitive, quindi non dovrebbe fare alcuna differenza se si sta utilizzando Content-Type, Content-type o CONTENT-TYPE. Inoltre, la tua risposta non spiega il motivo per cui solo un piccolo numero di utenti ha avuto questo problema.

ho una spiegazione diversa per il confine mancanti, uno basato sulla esperienza reale. Si scopre che alcuni fornitori di dati cellulari, in particolare Vodafone, filtrano tutte le richieste HTTP tramite proxy che aggiungono varie intestazioni personalizzate (come x-up-subno, HTTP_SM_MS_CRYPTED, e altri). Ho le prove del mondo reale che alcune di quelle deleghe forme mangle Pubblicato da multipart/form-data, rimuovendo l'attributo "confine" dell'intestazione Content-Type, e rendendo così la forma analizzabile per quasi qualsiasi server.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top