2018年7月25日水曜日

Perl CGI でバイナリファイルのアップロードに失敗する

use CGI;
my $cgi = new CGI();
my $fh = $cgi->upload(file);
my $temp = $cgi->tmpFileName($fh);
File::Copy::move($temp, $target_filename);

これでうまくいくはずなんですよね。
png ファイルをアップロードしても表示されない・・・
なかなかはまってしまいました。
コピーされたファイルのサイズが大きくなってるんです。

ファイルの中身をバイナリダンプしてみると、EF BF BD というバイト列が多数。
つまりバイト単位に変換できてないので無効な情報とされているわけ。

ネット上を検索していろいろ試しました。
binmode(STDIN);
とか
binmode(STDIN, ':raw');
とか
コピーを実装したりとか。

で、何時間も試行錯誤して、ふとスクリプトの上部を見てみると
use Encode;
use encoding 'utf-8';

ここで入力がすべてUTF-8 とみなされてしまい、バイナリ値が FF BF BD に変換されてしまっていたわけです。
この2行、削除したらまんまと動いてくれました。

0 件のコメント:

コメントを投稿