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?
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
Vous devez vous connecter pour publier un commentaire.
Le problème est exactement ce que j'ai suggéré dans mon premier commentaire. Qui est, les données encodées en base64 peut contenir des " + " des personnages. Dans x-www-form-urlencoded de données, 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.
Le '+' caractères de vos données initiales sont en tournant, en ' lorsqu'elles sont reçues et stockées. Lorsque vous ensuite de sortie de cette valeur, il n'est pas valide des données encodées en base64.
Si vous examinez la source de votre travail et non-travail des exemples, vous verrez que l'espace existe EXACTEMENT où il est un " + " dans l'original, encodé en Base64 de la valeur. Tous les retours à la ligne que vous voyez sont parce que ce que vous êtes en train de visualiser la source en est les lignes de conditionnement à un 'caractère'.
Dans votre iOS code dont vous avez besoin pour coder correctement les encodées en base64 valeur, dans votre cas, tout ce que vous devez faire est de % coder le '+' caractères.
MODIFIER pour ajouter, en réponse à un commentaire:
post = [post stringByReplacingOccurrencesOfString:@"+" withString:@"%"];
et maintenant, la chaîne n'est pas stockée à l'intérieur d'Mongo, bien que XCode est de serrage dehors à l'intérieur de la console. PHP echo de valeur Nulle, j'ai ajouté la ligne d'en dessous de la concaténation de la ligne ci-dessous VaryString 1 & 2Un pour cent codé ' + ' "%2B". Voir édité réponse ci-dessus.
Merci, fonctionne comme un charme absolu!!! Bouée de sauvetage.
Alors qu'est-ce que le PHP, le code côté? Replay S'Il Vous Plaît....
J'ai le même problème et maintenant résolu de suivre vos instructions ! Merci beaucoup 😀
OriginalL'auteur imaginaryboy