我正在使用服务将图片发送到服务器,他们要求在发送之前将图像转换为base64格式。我用这段代码尝试了MIME :: 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.
答案 0 :(得分:11)
指定空导入列表时,如下所示:
use MIME::Base64 ();
你没有进口。
将该行更改为:
use MIME::Base64;
()
parens指定MIME :: Base64不会向您的命名空间导出任何内容。默认行为(没有parens)是导出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
”本身只是一个单词,而Perl认为这是一个子程序调用。尖括号“<>
”是从文件句柄中读取的常用方法。 “local $/ = undef
”部分只是确保您将整个文件丢弃的一种方法,而不仅仅是第一个看起来像Perl的“\ n”的序列。
Update2:正如MOB指出的那样,您需要转义路径中的反斜杠,或者使用正斜杠。即使在Win32上,Perl并不介意。当然,既然您正在明智地使用or die $!
上的open
,那么您已经发现了这个错误。
答案 1 :(得分:1)
简短的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
它写入一个名为image_file.jpg.b64
的文件,其中包含Base64编码的输入文件。
要解码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
=&gt; image_file.jpg
。否则,脚本将.bin
添加到输入文件名以获取输出文件名。