実行可能ファイルを「配布」する Mojolicious Lite スクリプトがあります (ユーザーはスクリプトの URL からファイルをダウンロードできます)。エンコードされたデータを DATA セクションのインライン テンプレートに保持し、それをエンコードして render_data を実行します。
get '/download' => sub {
my $self = shift;
my $hex_data = $self->render_partial( 'TestEXE' );
my $bin_data;
while( $hex_data =~ /([^\n]+)\n?/g ) {
$bin_data .= pack "H".(length $1), $1;
}
my $headers = Mojo::Headers->new;
$headers->add( 'Content-Type', 'application/x-download;name=Test.exe' );
$headers->add( 'Content-Disposition', 'attachment;filename=Test.exe' );
$headers->add( 'Content-Description', 'File Transfer');
$self->res->content->headers($headers);
$self->render_data( $bin_data );
};
__DATA__
@@ TestEXE.html.ep
4d5a90000300000004000000ffff0000b8000000000000004000000000000000
00000000000000000000000000000000000000000000000000000000b0000000
0e1fba0e00b409cd21b8014ccd21546836362070726f6772616d2063616e6e6f
....
これをローカルで実行すると(http://127.0.0.1:3000/、Win7の組み込みWebサーバーを介して)、正しいファイル(サイズと内容)が得られます。しかし、共有ホスティング (Linux) で CGI モードで実行すると、正しいサイズで返されますが、ファイルの最初の 8 バイトは常に正しくありません (常に異なります)。ファイルの残りの部分は正しいです。
私のサブで、そこにあると思われるものを取得する$hex_data
代わりに指定します。$bin_data
私は途方に暮れています。