Perl将图像转换为base64

时间:2012-07-02 22:10:19

标签: perl

我正在使用服务将图片发送到服务器,他们要求在发送之前将图像转换为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.

2 个答案:

答案 0 :(得分:11)

指定空导入列表时,如下所示:

use MIME::Base64 ();

你没有进口。

将该行更改为:

use MIME::Base64;

() parens指定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并不介意。当然,既然您正在明智地使用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添加到输入文件名以获取输出文件名。