Base64 Потерять данные HTTP POST (Objective-C)

В настоящее время у меня есть HTTP POST Request и Base64 Encoding Library, я кодирую свое изображение на B64, а затем отправляю его через HTTP через метод POST.

Я выводил консоль Base64 в XCodes, копировал и вставлял ее, и она отлично работает. Хотя Base64, хранящийся в базе данных (MongoDB, Plain Text File и т. Д.), Всегда выходит из строя на другом конце.

Рабочая версия (скопирована и вставлена ​​с XCode): http://dontpanicrabbit.com/api/working.php Сломанная версия (из базы данных MongoDB): http://dontpanicrabbit.com/api/grabimage.php

Если вы посмотрите на источник, вы заметите, что они одинаковы, но в сломанную версию добавлен пробел.

Код Objective-C, который я использую:

MyImage.image = [info objectForKey:UIImagePickerControllerOriginalImage]; NSData *imageData = UIImageJPEGRepresentation(MyImage.image, 0); [Base64 initialize]; NSString *encoded = [Base64 encode:imageData]; NSString *urlPOST = encoded; //NSLog(@"%@",encoded); NSString *varyingString1 = @"picture="; NSString *varyingString2 = urlPOST; NSString *post = [NSString stringWithFormat: @"%@%@", varyingString1, varyingString2]; NSLog(@"%@", post); //NSString *post = @"image=%@",urlPOST; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:@"url/api/insertimage.php"]]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:postData]; NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; NSString *strResult = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

PHP -> хранилище MongoDB

 <?php try { // open connection to MongoDB server $conn = new Mongo('localhost'); // access database $db = $conn->dablia; // access collection $collection = $db->images; // insert a new document $item = array( 'picture' => $_POST['picture'] ); $collection->insert($item); echo 'Inserted document with ID: ' . $item['_id']; // disconnect from server $conn->close(); } catch (MongoConnectionException $e) { die('Error connecting to MongoDB server'); } catch (MongoException $e) { die('Error: ' . $e->getMessage()); } ?> 

Выходной код:

 <?php try { // open connection to MongoDB server $conn = new Mongo('localhost'); // access database $db = $conn->dablia; // access collection $collection = $db->images; // execute query // retrieve all documents $cursor = $collection->find(); // iterate through the result set // print each document foreach ($cursor as $obj) { echo '<img src="data:image/jpeg;base64,'.trim($obj['picture']).'">'; } // disconnect from server $conn->close(); } catch (MongoConnectionException $e) { die('Error connecting to MongoDB server'); } catch (MongoException $e) { die('Error: ' . $e->getMessage()); } ?> 

Я понятия не имею, почему я, кажется, разлагаю POST?

Related of "Base64 Потерять данные HTTP POST (Objective-C)"

Проблема в том, что я предложил в своем первом комментарии. То есть данные, закодированные в base64, могут содержать символы «+». В данных x-www-form-urlencoded приемник знает, что «+» является кодировкой символа пробела. Таким образом, поскольку вы не кодируете URL-адрес вашего значения base64, любые экземпляры «+» могут привести к повреждению данных при их получении.

Символы '+' в ваших исходных данных превращаются в '', когда они получены и сохранены. Когда вы выведете это значение, это недопустимые данные с кодировкой base64.

Если вы изучите источник своих рабочих или нерабочих примеров, вы увидите, что пробел существует ТОЧНО, где есть «+» в исходном кодированном значении Base64. Любые новые строки, которые вы видите, связаны с тем, что все, что вы просматриваете в источнике, – это обертывание строк символом ''.

В коде iOS вам необходимо правильно закодировать кодированное значение base64, в вашем случае все, что вам действительно нужно сделать, это процент кодирования символов «+».

EDIT добавить в ответ на комментарий:

 post = [post stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];