2013-02-10 14 views
16

मेरे पास वर्तमान में एक HTTP पोस्ट अनुरोध और बेस 64 एन्कोडिंग लाइब्रेरी है, मैं अपनी छवि को बी 64 पर एन्कोड करता हूं और उसे POST विधि के माध्यम से HTTP पर भेजता हूं।HTTP पोस्ट से अधिक डेटा खोने वाले डेटा (उद्देश्य-सी)

मैं बेस 64 को एक्सकोड्स कंसोल पर आउटपुट करता हूं, इसे कॉपी और पेस्ट करता हूं और यह पूरी तरह से काम करता है। यद्यपि बेस 64 मैं डाटाबेस (मोंगोडीबी, सादा पाठ फ़ाइल इत्यादि) के भीतर स्टोर करता हूं, फिर भी दूसरे छोर पर भ्रष्ट हो जाता है।

कार्य संस्करण (कॉपी किया गया और XCode से चिपकाया): http://dontpanicrabbit.com/api/working.php टूटी संस्करण (MongoDB डाटाबेस से): http://dontpanicrabbit.com/api/grabimage.php

आप स्रोत देखते हैं तो आप वे एक ही हैं, लेकिन वहाँ टूट में खाली स्थान के लिए जोड़ा जाता है पर ध्यान देंगे संस्करण।

ऑब्जेक्टिव-सी कोड मैं का उपयोग कर रहा है:

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]; 

पीएचपी -> 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()); 
} 
?> 

मुझे पता नहीं क्यों मुझे लगता है पोस्ट पर भ्रष्ट होने के लिए?

+0

Base64 इनकोडिंग डेटा '+' वर्ण हो सकते हैं। एक्स-www-form-urlencoded डेटा में (जैसा कि मुझे लगता है कि आपका पोस्ट किया गया डेटा है) रिसीवर जानता है कि '+' एक स्पेस कैरेक्टर का एन्कोडिंग है। इस प्रकार से चूंकि आप अपने बेस 64 मान को एन्कोड नहीं कर रहे हैं, इसलिए '+' के किसी भी उदाहरण से प्राप्त होने पर डेटा दूषित हो जाएगा। हो सकता है कि आप जो अनुभव कर रहे हों या हो, लेकिन आप इसे किसी बिंदु पर अनुभव करेंगे। – imaginaryboy

+0

मुझे लगता है कि पीएचपी आउटपुट होने पर समस्या व्हाइटस्पेस है, मैंने दोनों काम (प्रत्यक्ष प्रतिलिपि से कनवर्ट करने की प्रतिलिपि) और PHP के डेटाबेस संस्करण की तुलना की है, ऐसा लगता है कि PHP संस्करण के स्रोत में व्हाइटस्पेस और लाइन रिटर्न है, इससे यह हो रहा है तोड़ो, मैंने गूंज के चारों ओर ट्रिम() की कोशिश की है लेकिन कोई फायदा नहीं –

+0

तो आपका $ _POST ['picture'] मान आईओएस एप्लिकेशन से लॉग इन करने के समान है? साथ ही, अगर आपको लगता है कि समस्या तब होती है जब आप PHP में मान आउटपुट करते हैं, तो शायद आपको उस कोड को अपने प्रश्न में शामिल करना चाहिए? – imaginaryboy

उत्तर

40

समस्या मेरी बिल्कुल पहली टिप्पणी में सुझाई गई समस्या है। यही है, बेस 64 एन्कोडेड डेटा में '+' वर्ण हो सकते हैं। एक्स-www-form-urlencoded डेटा में रिसीवर जानता है कि '+' एक स्पेस कैरेक्टर का एन्कोडिंग है। इस प्रकार से चूंकि आप अपने बेस 64 मान को एन्कोड नहीं कर रहे हैं, इसलिए '+' के किसी भी उदाहरण से प्राप्त होने पर डेटा दूषित हो जाएगा।

आपके प्रारंभिक डेटा में '+' वर्ण प्राप्त होने और संग्रहीत होने पर '' 'में बदल रहे हैं। जब आप उस मान को आउटपुट करते हैं, तो यह अवैध बेस 64 एन्कोडेड डेटा है।

यदि आप अपने कामकाजी बनाम गैर-कामकाजी उदाहरणों के स्रोत की जांच करते हैं तो आप देखेंगे कि व्हाइटस्पेस वास्तव में मौजूद है जहां मूल बेस 64 एन्कोडेड मान में '+' है। आप जो भी न्यूलाइन देख रहे हैं वह इसलिए है क्योंकि जो भी आप स्रोत को देख रहे हैं वह एक 'अक्षर' पर लाइनों को लपेट रहा है।

अपने आईओएस कोड में आपको बेस 64 एन्कोडेड वैल्यू को सही तरीके से एन्कोड करने की आवश्यकता है, आपके मामले में आपको वास्तव में '+' अक्षरों को एन्कोड करना होगा।

संपादित करें टिप्पणी के जवाब में जोड़ने के लिए,:

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

बस इस पोस्ट को 'post = [post stringbyReplacingOccurrencesOfString: @ "+" withString: @ "%"] का उपयोग करके दिया गया था;' और अब स्ट्रिंग को मोंगो के अंदर बिल्कुल भी संग्रहीत नहीं किया गया है, हालांकि एक्सकोड इसे कंसोल के अंदर बाहर कर रहा है। पीएचएल इकोस आउट नल, मैंने VaryString 1 और 2 –

+0

के नीचे कॉन्सटेनेशन लाइन के नीचे की रेखा को जोड़ा, '+' एन्कोडेड प्रतिशत "% 2 बी" है। उपरोक्त संपादित उत्तर देखें। – imaginaryboy

+0

धन्यवाद, एक पूर्ण आकर्षण की तरह काम कर रहा है !!! Lifesaver। –

संबंधित मुद्दे