2011-01-10 3 views
0

Я использую NSMutableURLRequest для загрузки изображения на веб-сервер. Я думал, что мой код был стабильным, поскольку он работает для большинства пользователей, но некоторые пользователи просто не могут загружать изображения. Глядя на журналы моего сервера, я вижу случайныеСлучайная ошибка «без границ» с NSMutableURLRequest

«Отсутствует граница в данных POST-данных с сообщением multipart/form-data in Unknown on line 0», указывающая на ошибку границы при построении тела сообщения.

Ниже то, что я использую:

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

Я могу понять, если код в результате предупреждения PHP 100% времени, но это, вероятно, происходит один раз в каждые 30 или 40 пользователей. Если пользователь получает эту ошибку, то она одинакова для любого изображения, которое они пытаются опубликовать.

Может ли кто-нибудь увидеть что-либо сразу же очевидное или иметь представление о том, почему это будет проблемой с прерывистой ситуацией?

ответ

0

Оказывается, проблема была с этой линии:

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

Это, конечно, должно быть:

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

(обратите внимание на регистр). Однако не уверен, почему это нарушило запрос только для небольшого числа пользователей.

1

Поля заголовка HTTP нечувствительны к регистру, поэтому не должно иметь значения, используете ли вы Content-Type, Content-type или CONTENT-TYPE. Кроме того, ваш ответ не объясняет, почему эта проблема возникла только у небольшого числа ваших пользователей.

У меня есть другое объяснение недостающей границы, основанной на фактическом опыте. Оказывается, некоторые поставщики сотовых данных, в частности Vodafone, фильтруют все HTTP-запросы через прокси, которые добавляют различные пользовательские заголовки (например, x-up-subno, HTTP_SM_MS_CRYPTED и другие). У меня есть реальные доказательства того, что некоторые из этих прокси-серверов управляют формами POSTed как multipart/form-data, удаляя атрибут «границы» заголовка Content-Type и, таким образом, делает форму невозможной для любого сервера.

Смежные вопросы