Вопрос

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

«Отсутствующая граница в разумных данных Multipart / Form-Data Post в неизвестном в строке 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 пользователей. Если пользователь получает эту ошибку, то же самое для любого изображения, которое они пытаются опубликовать.

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

Это было полезно?

Решение 2

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

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top