Отправка массива JSON и UIImageView в одном NSURLRequest

В настоящее время я пытаюсь отправить массив JSON и UIImageView в одном и том же NSURLRequest, чтобы избежать нескольких сетевых вызовов в моей базе данных. Следуя предложениям, данным в других ответах, я написал в Objective C функцию, которая заключается в следующем:

    NSDictionary *textFields = [NSDictionary dictionaryWithObjectsAndKeys:self.reviewTexfField.text, @"review",
self.rateView.rating, @"grade", nil];

if([NSJSONSerialization isValidJSONObject:textFields]){


NSError* error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:textFields options:0 error:&error];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[jsonData length]];
NSURL *url = [NSURL URLWithString:@"http://domain.something/file.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; application/json; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPMethod:@"POST"];

NSMutableData *body = [NSMutableData data];

// Appending image.
NSString *imageName = @"A name";
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photo\"; filename=\"%@.jpg\"\r\n", imageName] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"\r\n--\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

NSData *imageData = UIImageJPEGRepresentation(self.immagineRecensione.image, 0.5);
[body appendData:imageData];


//Appending JSON request
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:jsonData];
[body appendData:[[NSString stringWithFormat:@"\r\n--\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

NSLog(@"%@", [request allHTTPHeaderFields]);
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse* response, NSError *error)
{
NSString *response= [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", response);

if(!error) NSLog(@"Done \n");

}] resume];

}
}

Со стороны сервера я написал скрипт php (5.0, устарел, но только для тренировок):

    <?php

$con = mysql_connect("something", "username", "password");
if(!$con)
die("Error during connection" . mysql_error());

$db_selected = mysql_select_db("DB", $con);

$uploaddir = "./aFolder/";
$user = basename($_FILES['photo']['name']);
$storeName = $uploaddir.$user;
echo $storeName. "\n ";

if (move_uploaded_file($_FILES['photo']['tmp_name'], $uploadfile))
echo 'The photo has been inserted in the database\n';
else die("The photo hasn't been copied. \n " . mysql_error());


$jsondata = file_get_contents('php://input');
$textFields = json_decode($jsondata, true);

$review = $data['review'];
$grade = $data['grade'];

//Echoing for debug purposes
echo $review . " " . $grade . "\n ";

mysql_close($con);
?>

Проблема, с которой я сталкиваюсь, заключается в том, что я ничего не получаю со стороны сервера: соединение может быть установлено, но кажется, что ни одно поле не отправлено. Чего мне нужно добиться, так это того, чтобы я мог скопировать изображение в папку внутри своей базы данных и получить ответ, содержащий текст двух полей, отправленных в массиве JSON, отраженных с сервера.

1

Решение

Вам следует выбрать либо запрос JSON (в этом случае вы включите изображение в виде строки в кодировке base64), либо запрос из нескольких частей (в котором вы просто включите два строковых значения в качестве дополнительных частей запроса), но не оба одновременно. , Я мог бы использовать JSON, если бы отправлял какую-то очень богатую структуру (например, вложенный массив словарей), но дал бы здесь простую структуру (две строки), я бы склонялся к простому многочастному запросу.

К сожалению, построение составного запроса, приведенное выше, не совсем правильно. Я бы отослал вас к https://stackoverflow.com/a/24252378/1271826, который может загружать файлы, а также предоставлять текстовые поля. Или подумайте об использовании фреймворка вроде AFNetworking, который выводит вас из сорняков или создает этот запрос.

С точки зрения обработки ответа на сервере, так как клиентский код указал, что он примет ответ JSON, я предполагаю, что вы хотите, чтобы сервер создал такой ответ. Смотрите пункт № 2 в https://stackoverflow.com/a/20196541/1271826 для примера mysqli или же PDO_MySQL (в частности, не использовать устаревший mysql интерфейс из вашего примера кода; увидеть http://php.net/manual/en/intro.mysql.php) код, который

  • получает multi-part/formdata запрос,
  • ускользает значения или делает ? связывание,
  • вставляет данные в вашу базу данных, и
  • затем строит ответы JSON.

Очевидно, вы все равно получите файл, используя move_uploaded_file в исходном фрагменте кода, но вы получаете доступ к этим двум текстовым полям, используя $_POST параметры и вы можете удалить, что file_get_contents('php://input') шаблон, который используется только для запросов JSON.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]