2012-07-02 203 views
6

我正在使用服務將圖片發送到服務器,並且它們要求圖像在發送之前轉換爲base64格式。我試圖MIME :: Base64編碼與此代碼:Perl將圖像轉換爲base64

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

反斜槓在雙引號內有特殊含義。你可以使用單引號('C:\ wamp \ www \ image.png''),用更多的反斜槓('「C:\\ wamp \\ www \\ image.png」')轉義反斜槓,或者只是使用正斜槓(確實如此):'「C:/wamp/www/image.png」'。 – mob

+0

Windows上的Mime :: Base64模塊似乎有問題(至少在ActiveState perl 5.8.8中) - 是的,我試圖用'使用Mime :: Base64 qw(decode_base64)'導入該子例程。 –

回答

10

當您指定空的導入列表,像這樣:

use MIME::Base64(); 

你沒有進口。

更改該行:

use MIME::Base64; 

()括號被指定MIME :: Base64的出口沒有你的命名空間。缺省行爲(沒有parens)是導出encode_base64decode_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」本身就是一個裸語,而Perl認爲它是一個子程序調用。尖括號「<>」是從文件句柄中讀取的常用方式。 「local $/ = undef」部分只是確保您瀏覽整個文件的一種手段,而不僅僅是第一個看起來像Perl的「\ n」的序列。

Update2:正如MOB指出的那樣,您或者需要避開路徑中的反斜槓,或者使用正斜槓。即使在Win32上,Perl也不介意。當然,因爲您正在採取在open上使用or die $!的明智措施,您已經發現了這個錯誤。

+0

現在解碼是文本「圖像」(真的不需要解碼,我只想從我的目錄中選擇一個圖像,並將其轉換爲64位) – Grigor

+0

在我的原始答覆中查看我的更新。 – DavidO

+0

請注意,至少在Windows上,您必須使用'binmode(filehandle)',否則從二進制文件內容生成的Base64輸出將是錯誤的(實際上觀察到將zip文件轉換爲Base64) – 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文件。

要解碼的Base64,你可以使用這個腳本:

# 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"; 

使用此命令行調用它:

perl decode_base64.pl my_base64_file.b64 

如果作爲參數提供給該腳本文件名以.b64結束這些尾隨4字符將被刪除:image_file.jpg.b64 =>image_file.jpg。否則,該腳本會將.bin添加到輸入文件名以獲取輸出文件名。