【发布时间】:2013-02-11 06:50:31
【问题描述】:
我目前有一个 HTTP POST 请求和一个 Base64 编码库,我将图像编码为 B64,然后通过 POST 方法通过 HTTP 发送。
我将 Base64 输出到 XCodes 控制台,复制并粘贴它,它可以完美运行。虽然我存储在数据库中的 Base64(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 数据中(正如我所期望的您发布的数据),接收者知道“+”是空格字符的编码。因此,由于您没有对 base64 值进行 URL 编码,因此任何“+”实例都会导致数据在接收时损坏。这可能是也可能不是你正在经历的,但你会在某个时候经历它。
-
我认为问题是 PHP 输出时的空白,我比较了工作(直接从转换中复制粘贴)和 php 的数据库版本,似乎 PHP 的源代码中有空白和行返回版本,这导致它中断,我在 echo 周围尝试了 trim() 但无济于事
-
所以您的 $_POST['picture'] 值与您从 iOS 应用程序记录的值相同?另外,如果您认为问题出在 PHP 中输出值时,也许您应该在问题中包含该代码?
-
它是相同的,但是有空格,很多空格,我认为这是问题所在,无论如何我都会包含代码
-
我不认为您可以发布(或链接到?)正确数据的样本以及带有额外空格的数据?
标签: php ios objective-c xcode http