Base64通过HTTP POST丢失数据(Objective-C)

我目前有一个HTTP POST请求和一个Base64编码库,我编码我的图像到B64然后发送通过HTTP通过POST方法。

我输出Base64到XCodes控制台,复制并粘贴它,它完美的工作。 尽pipe数据库中的Base64 I存储(MongoDB,纯文本文件等)总是在另一端损坏。

工作版本(复制并从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()); } ?> 

我不知道为什么我似乎是腐蚀邮政?

这个问题正是我在第一条评论中提出的。 也就是说,base64编码的数据可以包含“+”字符。 在x-www-form-urlencoded数据中,接收者知道“+”是空格字符的编码。 因此,由于你不是URL编码你的base64值,任何“+”的实例将导致数据被收到时被破坏。

初始数据中的“+”字符在接收和存储时变成“”。 当你输出这个值时,它是无效的base64编码数据。

如果你检查你的工作与非工作的例子的来源,你会发现,原来的Base64编码值中存在“+”的地方存在空格。 你看到的任何换行符都是因为你正在查看的源代码是以“'字符包装行。

在你的iOS代码中,你需要正确编码base64编码值,在你的情况下,你真正需要做的是百分比编码“+”字符。

编辑添加,以回应评论:

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