6

サービスを使用して画像をサーバーに送信していますが、画像を送信する前に 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.

4

2 に答える 2

14

次のように、空のインポート リストを指定すると、次のようになります。

use MIME::Base64 ();

インポートはありません。つまり、関数名encode_base64は呼び出し元の名前空間にインポートされません。インポートを許可するか、呼び出すときに関数が存在するパッケージを明示的に参照して関数名を完全修飾することができます。

インポートするには、その行を次のように変更します。

use MIME::Base64;

括弧は、()MIME::Base64 が名前空間に何もエクスポートしないことを指定しています。デフォルトの動作 (括弧なし) は、エクスポートencode_base64およびdecode_base64. インポート リストで空の括弧を使用すると、これら 2 つの関数名をインポートするという便利なデフォルトの動作が上書きされます。mainこれらの関数が名前空間を汚染したくない場合は、元のuse MIME::Base64 ()行を保持してから、サブルーチン呼び出しを完全に修飾することができます。

$encoded = MIME::Base64::encode_base64($base64_string);

しかし、行から括弧を削除して、デフォルトのエクスポート リストを処理できるようにする方がはるかに簡単で、おそらく満足のいくものですuse

または、何をインポートするかを正確に指定できます。

use MIME::Base64 ('encode_base64');

encode_base64これにより、関数のみがインポートされ、 はインポートされないためdecode_base64、名前空間の汚染が最小限に抑えられます。

更新また、ファイルを読んでいません。この行:

$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 が指摘しているように、パス内のバックスラッシュをエスケープするか、スラッシュを使用する必要があります。Perl は Win32 でも気にしません。もちろん、あなたは を で使用するという賢明な一歩を踏み出してor die $!いるのでopen、すでにこの間違いに気づいています。

于 2012-07-02T22:14:09.897 に答える
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.b64Base64 でエンコードされた入力ファイルを含むという名前のファイルを書き込みます。

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して、出力ファイル名を取得します。

于 2017-02-07T16:30:40.003 に答える