引き続き MovableType4 のお話。
なぜか jpeg イメージファイルをアップロードすると「Invalid image file format.」と言われてアップロード出来ない現象に遭遇。
最初はアップロードしようとしたイメージが壊れている、とか、フォーマットが CMYK なのか、と思っていろいろと調べたけど、全く正常な(?) jpeg ファイル。
これにはかなり参りましたよ。
で、結局ソースファイルを追いかけて調査。その結果わかったのが…MT/CMS/Asset.pm(1162) 以降の以下の部分。
## Read first 1k of image file
binmode($fh);
seek($fh, 0, 0);
read $fh, $data, 1024;
seek($fh, 0, 0);
## Using an error message format that already exists in all localizations of Movable Type 4.
return $app->error($app->translate("Saving [_1] failed: [_2]", $local_base, "Invalid image file format.")) if
( $data =~ m/^\s*<[!?]/ ) ||
( $data =~ m/<(HTML|SCRIPT|TITLE|BODY|HEAD|PLAINTEXT|TABLE|IMG|PRE|A)/i ) ||
( $data =~ m/text\/html/i ) ||
( $data =~ m/^\s*<(FRAMESET|IFRAME|LINK|BASE|STYLE|DIV|P|FONT|APPLET)/i ) ||
( $data =~ m/^\s*<(APPLET|META|CENTER|FORM|ISINDEX|H[123456]|B|BR)/i )
;
この処理は InternetExplorer6/7 の脆弱性に対応したものみたいで(コメントがそんなことを書いてある)、用は読み込もうとしたファイルの先頭 1024byte に html のタグがあると、イメージファイルではなく html として認識してしまうため、らしい。
で、ハイライトした箇所で'<A'があるとエラーになるようになっていて…偶然そのバイト列があってしまった、と。
う~~ん、やりたいことはわかるんだけど…これはなぁ。さすがに困ってしまったよ(^^ゞ
結局圧縮率を変更して、該当バイト列が出てこないようにしてしのいだけど…さてはて、どうしたものでしょうかね。
該当部分を
m/<(HTML|SCRIPT|TITLE|BODY|HEAD|PLAINTEXT|TABLE|IMG|PRE|A)(\s+|>)/i
とかにするくらい?
コメントを投稿する