Base64 Sur HTTP POST de perdre des données (Objective-C)

Actuellement j'ai une Requête HTTP POST et un Encodage Base64 de la Bibliothèque, j'ai coder mon image à B64, puis de l'envoyer sur HTTP via la méthode POST.

Je sortie de la Base64 pour XCodes de la console, le copier et le coller et il fonctionne parfaitement. Bien que le Base64-je stocker dans la Base de données (MongoDB, Fichier Texte, etc) sont toujours corrompus sur l'autre extrémité.

Version de travail (Copié et Collé à partir de XCode): http://dontpanicrabbit.com/api/working.php
Version Endommagée (À Partir De La Base De Données MongoDB): http://dontpanicrabbit.com/api/grabimage.php

Si vous affichez le code source, vous remarquerez qu'ils sont les mêmes, mais il y a ajouté des espaces dans la version endommagée.

Le code Objective-C que j'utilise est:

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 Stockage

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

De Code De Sortie:

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

Je n'ai aucune idée de pourquoi j'ai l'impression de corruption de plus de POST?

Les données encodées en Base64 peut contenir des " + " des personnages. Dans x-www-form-urlencoded de données (comme j'attends vos données validées sont) le récepteur sait que '+' est un encodage d'un caractère espace. Ainsi, puisque vous n'êtes pas à l'encodage de l'URL de votre base64 valeur, toutes les occurrences de '+' causera les données soient endommagées lors de la réception. Qui peut ou peut ne pas être ce que vous êtes en train de vivre, mais vous ferez l'expérience à un certain point.
Je pense que le problème est les Espaces lors de l'PHP obtient en sortie, j'ai comparé les deux de travail (direct copier coller de convertir) et php de la version de base de données, il semble qu'il y ait des espaces et retourne à la source de la version de PHP, ce qui est à l'origine de pause, j'ai essayé trim() autour de l'écho, mais en vain
Si votre $_POST['image'] valeur est identique à ce que vous vous connectez à partir de l'application iOS? Aussi, si vous pensez que le problème est lors de la sortie de la valeur en PHP, peut-être que vous devriez inclure ce code dans votre question?
Il est identique, mais il y a des espaces, beaucoup d'espaces, ce qui je pense est le problème, je vais inclure le code de toute façon
Je ne pense pas que vous pouvez poster (ou un lien?) des échantillons de données correctes, et les données avec l'espace?

OriginalL'auteur Jacob Clark | 2013-02-10