2013-02-10 3 views
16

현재 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를 통해 손상 될 수 있습니까?

+0

Base64로 인코딩 된 데이터는 '+'문자를 포함 할 수 있습니다. x-www-form-urlencoded 데이터에서 (사용자의 POST 된 데이터가 예상 됨) 수신자는 '+'가 공백 문자의 인코딩임을 알고 있습니다. 따라서 base64 값을 인코딩하는 URL이 아니기 때문에 '+'의 인스턴스는 수신시 데이터가 손상 될 수 있습니다. 그것은 당신이 경험하고있는 것일 수도 아닐 수도 있지만 어느 시점에서 경험하게 될 것입니다. – imaginaryboy

+0

필자는 PHP가 출력 될 때 문제가 공백이라고 생각합니다. 나는 변환 (직접 복사 붙여 넣기)과 PHP 데이터베이스 버전을 비교했습니다. PHP 버전의 소스에서 공백과 라인이 반환되는 것처럼 보입니다. 휴식, 에코 주위에 trim() 시도했지만 아무 쓸모가 –

+0

그래서 $ _POST [ 'picture'] 값은 iOS 응용 프로그램에서 로그 한 것과 동일합니까? 또한 PHP에서 값을 출력 할 때 문제가 있다고 생각한다면 질문에 해당 코드를 포함해야 할 것입니다. – imaginaryboy

답변

40

문제는 내가 처음 코멘트에서 제안한 것입니다. 즉, base64로 인코딩 된 데이터는 '+'문자를 포함 할 수 있습니다. x-www-form-urlencoded 데이터에서 수신기는 '+'가 공백 문자의 인코딩임을 알고 있습니다. 따라서 base64 값을 인코딩하는 URL이 아니기 때문에 '+'의 인스턴스는 수신시 데이터가 손상 될 수 있습니다.

초기 데이터의 '+'문자가 수신되어 저장되면 ''로 변합니다. 그 값을 출력하면 유효하지 않은 base64 인코딩 데이터입니다.

작동하는 작동 방식과 작동하지 않는 작동 방식의 출처를 살펴보면 원래 Base64로 인코딩 된 값에 '+'가있는 공백이 정확히 있음을 알 수 있습니다. 소스를보고있는 모든 것이 ''문자로 줄 바꿈이기 때문에 표시되는 모든 줄 바꿈이 있습니다.

iOS 코드에서 base64로 인코딩 된 값을 올바르게 인코딩해야합니다. 실제로 필요한 경우 퍼센트로 '+'문자를 인코딩해야합니다.

편집은 논평에 대한 응답으로, 추가 :

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

'post = [post stringByReplacingOccurrencesOfString : @ "+"withString : @ "%"];'를 사용하여 이것을 전부터 제공했으며, XCode가 콘솔 내부에서 그 문자열을 집어 넣지 만 문자열은 Mongo 안에 전혀 저장되지 않습니다. PHP는 Null을 에코합니다. VaryString 1과 2 아래의 연결 행 아래에 한 줄을 추가했습니다. –

+0

인코딩 된 백분율 '+'은 "% 2B"입니다. 위의 편집 된 답변을 참조하십시오. – imaginaryboy

+0

절대적인 매력처럼 일하는 고맙습니다 !!! 생명의 은인. –