2012-07-02 18 views
6

में कनवर्ट करें मैं सर्वर पर एक तस्वीर भेजने के लिए एक सेवा का उपयोग कर रहा हूं और उन्हें छवि भेजने के पहले बेस 64 प्रारूप में परिवर्तित करने की आवश्यकता है। मैं इस कोड के साथ माइम :: Base64 की कोशिश की:पर्ल छवि को बेस 64

use MIME::Base64(); 

open (IMAGE, "C:\\wamp\\www\\image.png") or die "$!"; 

$base64_string = IMAGE; 
$encoded = encode_base64($base64_string); 
print "Encode $encoded"; 

और यह त्रुटि संदेश

Undefined subroutine &mqin::encode_base64 called at line 6.

+1

बैकस्लाश के डबल कोट्स के अंदर विशेष अर्थ है। आप या तो सिंगल कोट्स ('' सी: \ वैंप \ www \ image.png'') का उपयोग करना चाहते हैं, बैकस्लैश से अधिक बैकस्लैश से बचें ('" सी: \\ वैंप \\ www \\ image.png "') या बस आगे slashes का उपयोग करें (यह ठीक है, वास्तव में): '" सी: /wamp/www/image.png "'। – mob

+0

विंडोज़ पर माइम :: बेस 64 मॉड्यूल (कम से कम एक्टिवस्टेट पर्ल 5.8.8 के साथ) में समस्या है - और हां, मैंने उस सबराउटिन को 'माइम :: बेस 64 क्यूड (डीकोड_बेसेज 64)' के साथ आयात करने की कोशिश की है। –

उत्तर

10

जब आप एक खाली आयात सूची निर्दिष्ट, इस तरह है:

use MIME::Base64(); 

आप कोई आयात नहीं मिलता है।

बदलें कि करने के लिए लाइन:

use MIME::Base64; 

() कोष्ठक निर्दिष्ट करते हैं कि माइम :: Base64 अपने नाम स्थान के लिए कुछ भी निर्यात करता है। डिफ़ॉल्ट व्यवहार (माता-पिता के बिना) encode_base64 और decode_base64 निर्यात करना है। आप सुविधाजनक डिफ़ॉल्ट ओवरराइड कर रहे हैं। क्या तुम सच में उन कार्यों अपने main नेमस्पेस को दूषित नहीं करना चाहते हैं आप अपने मूल use MIME::Base64() लाइन को बनाए रखने सकता है, और फिर अपने सबरूटीन कॉल पूरी तरह से योग्य हैं:

$encoded = MIME::Base64::encode_base64($base64_string); 

लेकिन यह सिर्फ अनुमति देने के लिए एक पूरी बहुत आसान है, और शायद करने के लिए संतोषजनक है आपकी use लाइन से ब्रांड्स को हटाकर संसाधित करने के लिए डिफ़ॉल्ट निर्यात सूची को संसाधित किया जाना चाहिए।

अद्यतन आप फ़ाइल भी नहीं पढ़ रहे हैं। यह पंक्ति:

$base64_string = IMAGE; 

... इस तरह अद्यतन किया जाना चाहिए:

$raw_string = do{ local $/ = undef; <IMAGE>; }; 
$encoded = encode_base64($raw_string); 

यही समस्या वरबोस रूप में दर्शा पकड़ा गया होता अगर आप प्रभाव में use strict 'subs' था। समस्या यह है कि "IMAGE" स्वयं ही एक शब्द है, और पर्ल सोचता है कि यह एक सबराउटिन कॉल है। कोण ब्रैकेट, "<>" एक फ़ाइल हैंडल से पढ़ने का सामान्य तरीका है। "local $/ = undef" भाग यह सुनिश्चित करने का एक माध्यम है कि आप पूरी फ़ाइल को स्लर्प करते हैं, न केवल पहले अनुक्रम तक जो कि "\ n" पर्ल पर दिखता है।

अद्यतन 2: और जैसा कि एमओबी बताता है, आपको या तो अपने पथ में बैकस्लैश से बचने की आवश्यकता है, या आगे की स्लैश का उपयोग करें। पर्ल को Win32 पर भी कोई फर्क नहीं पड़ता। बेशक आप अपने open पर or die $! का उपयोग करने का बुद्धिमान कदम उठा रहे हैं, तो आप पहले से ही इस गलती को खोज चुके हैं।

+0

अब डीकोडेड टेक्स्ट "IMAGE" है (वास्तव में कोई डिकोडिंग की आवश्यकता नहीं है, मैं बस अपनी निर्देशिका से एक छवि का चयन करना चाहता हूं और बेस 64 में कनवर्ट करना चाहता हूं) – Grigor

+0

मेरे मूल उत्तर में मेरा अपडेट देखें। – DavidO

+0

कृपया ध्यान दें कि कम से कम विंडोज़ पर आपको 'बिनमोड (फाइलहैंडल)' का उपयोग करना होगा, अन्यथा बाइनरी फ़ाइल सामग्री से उत्पन्न बेस 64 आउटपुट गलत होगा (वास्तव में ज़िप फ़ाइल को बेस 64 में कनवर्ट करना मनाया जाएगा) – elwood

0

एक छोटी Base64 एनकोडर कार्यक्रम:

# to_base64.pl 
use MIME::Base64 qw(encode_base64); 

open (IMAGE, $ARGV[0]) || die "$!"; 
binmode(IMAGE); 
local $/; 
my $file_contents = <IMAGE>; 
close IMAGE; 
open (B64, ">$ARGV[0].b64") || die $!; 
print B64 encode_base64($file_contents); 
close B64; 
print "output file is $ARGV[0].b64\n"; 

इस कमांड लाइन के साथ उपयोग करें:

perl to_base64.pl image_file.jpg 

यह Base64- एन्कोड इनपुट फ़ाइल युक्त image_file.jpg.b64 नाम की एक फ़ाइल लिखता है।

# decode_base64.pl 
use MIME::Base64 qw(decode_base64); 

open (B64, $ARGV[0]) || die "$!"; 
local $/; 
my $base64_string = <B64>; 
close B64; 
my $filename; 
if ($ARGV[0] =~ /.\.b64$/i) { 
    $filename = substr($ARGV[0], 0, length($ARGV[0]) - 4); 
} 
else { 
    $filename = "$ARGV[0].bin"; 
} 
open (IMAGE, ">$filename") || die $!; 
binmode(IMAGE); 
print IMAGE decode_base64($base64_string); 
close IMAGE; 
print "output file is $filename\n"; 

इस कमांड लाइन का उपयोग कर इसे कॉल करें::

Base64 को डिकोड करने के लिए, आप इस स्क्रिप्ट का उपयोग कर सकते

perl decode_base64.pl my_base64_file.b64 

फ़ाइल नाम इस स्क्रिप्ट को पैरामीटर के रूप में आपूर्ति की .b64 साथ समाप्त होता है तो इन अनुगामी 4 अक्षर हटा दिए जाएंगे: image_file.jpg.b64 =>image_file.jpg। अन्यथा, स्क्रिप्ट आउटपुट फ़ाइल नाम प्राप्त करने के लिए इनपुट फ़ाइल नाम में .bin जोड़ देगा।

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