2012-07-02 166 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添加到输入文件名以获取输出文件名。