현재 HTTP POST 요청과 Base64 인코딩 라이브러리가 있고 이미지를 B64로 인코딩 한 다음 POST 메서드를 통해 HTTP를 통해 보내줍니다.Base64 HTTP POST 데이터 손실 (목표 -C)
Base64를 XCodes 콘솔로 출력하고 복사하여 붙여 넣으면 완벽하게 작동합니다. 데이터베이스 (MongoDB, 일반 텍스트 파일 등)에 저장되는 Base64는 항상 다른 쪽 끝에서 손상됩니다.
워킹 버전 (복사 및 엑스 코드에서 붙여 넣은) : (MongoDB를 데이터베이스에서) http://dontpanicrabbit.com/api/working.php 깨진 버전 : 당신이 소스를 보면 http://dontpanicrabbit.com/api/grabimage.php
당신은 그들이 동일하지만 깨진에 공백이 추가됩니다 알 수 있습니다 번역.
내가 사용 오브젝티브 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 된 데이터가 예상 됨) 수신자는 '+'가 공백 문자의 인코딩임을 알고 있습니다. 따라서 base64 값을 인코딩하는 URL이 아니기 때문에 '+'의 인스턴스는 수신시 데이터가 손상 될 수 있습니다. 그것은 당신이 경험하고있는 것일 수도 아닐 수도 있지만 어느 시점에서 경험하게 될 것입니다. – imaginaryboy
필자는 PHP가 출력 될 때 문제가 공백이라고 생각합니다. 나는 변환 (직접 복사 붙여 넣기)과 PHP 데이터베이스 버전을 비교했습니다. PHP 버전의 소스에서 공백과 라인이 반환되는 것처럼 보입니다. 휴식, 에코 주위에 trim() 시도했지만 아무 쓸모가 –
그래서 $ _POST [ 'picture'] 값은 iOS 응용 프로그램에서 로그 한 것과 동일합니까? 또한 PHP에서 값을 출력 할 때 문제가 있다고 생각한다면 질문에 해당 코드를 포함해야 할 것입니다. – imaginaryboy