Base64 sobre HTTP POST perdiendo datos (Objective-C)

Actualmente tengo una request HTTP POST y una biblioteca de encoding Base64, codifico mi image a B64 y luego la envío a través de HTTP mediante el método POST.

Publicé la console Base64 a XCodes, la copio y pégalo y funciona perfectamente. Aunque el Base64 que almaceno dentro de la Base de Datos (MongoDB, Plain Text File, etc) siempre sale dañado en el otro extremo.

Versión de trabajo (copydo y pegado de XCode): http://dontpanicbit.com/api/working.php Versión quebrada (de la database MongoDB): http://dontpanicrabbit.com/api/grabimage.php

Si ve la fuente, notará que son los mismos, pero se agrega espacios en blanco en la versión dañada.

El código Objective-C que estoy usando es:

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 -> Almacenamiento 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()); } ?> 

Código de salida:

 <?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()); } ?> 

No tengo ni idea de por qué parece estar corrompiendo sobre el POST.

El problema es exactamente lo que sugerí en mi primer comentario. Es decir, los datos codificados en base64 pueden contener caracteres '+'. En los datos codificados en formatting x-www, el receptor sabe que '+' es una encoding de un carácter espacial. Por lo tanto, dado que no es la URL que codifica su valor de base64, cualquier instancia de '+' hará que los datos se corrompan cuando se reciban.

Los caracteres '+' en sus datos iniciales se convierten en '' cuando se reciben y se almacenan. Cuando luego sale ese valor, no es válido base64 datos codificados.

Si examina la fuente de sus ejemplos de trabajo en comparación con los que no funcionan, verá que el espacio en blanco existe EXACTAMENTE donde hay un "+" en el valor codificado Base64 original. Cualquier nueva línea que está viendo es porque todo lo que está viendo en la fuente es envolver líneas en un carácter.

En su código iOS, necesita codificar correctamente el valor codificado base64, en su caso, todo lo que necesita hacer es codificar por ciento los caracteres '+'.

EDITAR para agregar, en respuesta a un comentario:

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