引き続き 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
とかにするくらい?
コメントを投稿する