php – Base64 over HTTP POST丢失数据(Objective-C)
我目前有一个HTTP POST请求和一个Base64编码库,我将我的图像编码到B64,然后通过POST方法通过HTTP发送。
我输出Base64到XCodes控制台,复制并粘贴它,它的工作完美。虽然在数据库(MongoDB,纯文本文件等)中存储的Base64总是在另一端出现损坏。 工作版本(从XCode复制并粘贴):http://dontpanicrabbit.com/api/working.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上腐蚀? 解决方法
问题正是我在第一条评论中所建议的。也就是说,base64编码的数据可以包含”字符。在x-www-form-urlencoded数据中,接收者知道“’是空格字符的编码。因此,由于您不是对base64值进行URL编码,任何“’”实例将导致数据在收到时被破坏。
初始数据中的“”字符在接收和存储时变为“”。当您输出该值时,它是无效的base64编码数据。 如果您检查您的工作和非工作示例的来源,您将看到空格存在于原始Base64编码值中有“’”的空格。您看到的任何换行符都是因为您正在查看的源代码是将线条换成“”字符。 在您的iOS代码中,您需要对base64编码的值进行正确编码,在您的情况下,您真正??需要做的是对”字符进行百分比编码。 编辑补充,回应评论: post = [post stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |