Perl преобразование изображения в base64

Я использую службу для отправки изображения на сервер, и они требуют, чтобы изображение было преобразовано в формат base64 перед его отправкой. Я попробовал MIME:: Base64 с этим кодом:

use MIME::Base64 ();

open (IMAGE, "C:wampwwwimage.png") or die "$!";

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

и получил это сообщение об ошибке

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

2 ответов


когда вы указываете пустой список импорта, например:

use MIME::Base64 ();

вы не получаете импорта.

измените эту строку на:

use MIME::Base64;

на () parens указывают, что MIME:: Base64 ничего не экспортирует в ваше пространство имен. Поведение по умолчанию (без скобок) экспортировать encode_base64 и decode_base64. Вы переопределяете удобное значение по умолчанию. Если вы не хотите, чтобы эти функции загрязняться main пространство имен, вы можете сохранить ваш оригинальный use MIME::Base64 () line, а затем полностью квалифицируйте вызов подпрограммы:

$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' в силе. Проблема в том, что "<> " являются распространенным способом чтения из файла. В "local $/ = undef" часть-это просто средство обеспечения того, чтобы вы хлебали весь файл, а не только до первой последовательности, которая выглядит как "\n" для Perl.

обновление 2: и, как указывает MOB, вам либо нужно избегать обратных косых черт на вашем пути, либо использовать косая черта. Perl не возражает, даже на Win32. Конечно, так как вы делаете мудрый шаг использования or die $! на open, вы уже обнаружили эту ошибку.


короткая программа кодировщика 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 =>image_file.jpg. В противном случае скрипт добавит .binк имени входного файла, чтобы получить имя выходного файла.