मेरे पास वर्तमान में एक 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());
}
?>
मुझे पता नहीं क्यों मुझे लगता है पोस्ट पर भ्रष्ट होने के लिए?
Base64 इनकोडिंग डेटा '+' वर्ण हो सकते हैं। एक्स-www-form-urlencoded डेटा में (जैसा कि मुझे लगता है कि आपका पोस्ट किया गया डेटा है) रिसीवर जानता है कि '+' एक स्पेस कैरेक्टर का एन्कोडिंग है। इस प्रकार से चूंकि आप अपने बेस 64 मान को एन्कोड नहीं कर रहे हैं, इसलिए '+' के किसी भी उदाहरण से प्राप्त होने पर डेटा दूषित हो जाएगा। हो सकता है कि आप जो अनुभव कर रहे हों या हो, लेकिन आप इसे किसी बिंदु पर अनुभव करेंगे। – imaginaryboy
मुझे लगता है कि पीएचपी आउटपुट होने पर समस्या व्हाइटस्पेस है, मैंने दोनों काम (प्रत्यक्ष प्रतिलिपि से कनवर्ट करने की प्रतिलिपि) और PHP के डेटाबेस संस्करण की तुलना की है, ऐसा लगता है कि PHP संस्करण के स्रोत में व्हाइटस्पेस और लाइन रिटर्न है, इससे यह हो रहा है तोड़ो, मैंने गूंज के चारों ओर ट्रिम() की कोशिश की है लेकिन कोई फायदा नहीं –
तो आपका $ _POST ['picture'] मान आईओएस एप्लिकेशन से लॉग इन करने के समान है? साथ ही, अगर आपको लगता है कि समस्या तब होती है जब आप PHP में मान आउटपुट करते हैं, तो शायद आपको उस कोड को अपने प्रश्न में शामिल करना चाहिए? – imaginaryboy