我目前有一個HTTP POST請求和一個Base64編碼庫,我將圖像編碼到B64,然後通過POST方法通過HTTP發送它。Base64 Over HTTP POST丟失數據(Objective-C)
我輸出Base64到XCodes控制檯,複製並粘貼它,它完美的工作。儘管數據庫中的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());
}
?>
我不知道爲什麼我似乎是通過POST腐敗?
Base64編碼數據可以包含 '+' 字符。在x-www-form-urlencoded數據中(因爲我希望你的POST數據是)接收者知道'+'是空格字符的編碼。因此,由於您不是URL編碼base64值,任何「+」實例都會導致數據在收到時被破壞。這可能是也可能不是你正在經歷的,但你會在某個時候體驗它。 – imaginaryboy 2013-02-10 21:40:21
我認爲這個問題是空格當PHP輸出,我已經比較兩個工作(從轉換直接複製粘貼)和PHP的數據庫版本,似乎有PHP空間的源代碼中的空白和行返回,這導致它打破,我已經嘗試過修剪()周圍的回聲但無濟於事 – 2013-02-10 21:45:35
因此,你的$ _POST ['圖片']的價值是相同的,你從iOS應用程序登錄?另外,如果您認爲問題出在PHP中輸出值時,也許您應該在您的問題中包含該代碼? – imaginaryboy 2013-02-10 21:55:19