2008-12-23 [長年日記]

_ [Computer][Linux][PHP] MediaWiki: "The file is corrupt or has an incorrect extension. Please check the file and upload again." on Linux (RHEL 5)

MediaWiki で Excel や PowerPoint のファイルをアップロードしようとすると、"The file is corrupt or has an incorrect extension. Please check the file and upload again." というエラーが出てアップロードできない。Word ファイルは大丈夫。 なんでこれが起こるかというと、MIMEタイプの判定がうまくいっていないから。ではなぜMIMEタイプの判定がうまくいかないかというと、MIMEタイプの判定に、file コマンドを使う (LocalSettings.phpで、$wgMimeDetectorCommand = "file --brief --mime"; とかしてる場合。そうじゃない場合は、PHP付属の mime_content_type という関数を使う) のだけど、Excel や PowerPoint ファイルを file コマンドを使って判定すると、application/msword で返ってくるから。/usr/share/file/magic.mime (もしくは、/usr/share/magic.mime これは、/usr/share/file/magic.mime からのシンボリックリンク) を見ればわかるけど、MS Officeファイルは、ほぼ全部 application/msword に判別される。 MediaWiki上のMIMEタイプの判定方法の詳しい動作は、"Manual:Mime type detection"を見るか、ソースを見ればわかるけど、file コマンド使って Excel や PowerPoint ファイルをチェックしたあと、includes/mime.types ファイルのエントリを見て、拡張子と判定結果をチェックする。mime.types ファイルには、
application/msword doc
application/vnd.ms-excel xls
application/vnd.ms-powerpoint ppt
といったエントリがあるんだが、file コマンドの判定結果が、application/msword にしかならないから、拡張子が".doc"じゃないとエラーになる。そのため、タイトルのエラーメッセージが出る。 では、どうすればいいかというと、とりあえずでよければ以下3つのどれか。
  • [MediaWikiのインストールディレクトリ]/includes/mime.types ファイルを編集 以下のように書き換える(application/msword を doc だけじゃなく、xls や ppt にも結びつける)。
    application/msword doc xls ppt
    LocalSettings.php に以下を追加。
    $wgMimeDetectorCommand = "file --brief --mime";
    もしくは
    $wgMimeDetectorCommand = "file -bi";
  • Fileinfoモジュールを使用 PHP 5.3.0以前のバージョンを使ってる場合は、PECLのFileinfoをインストール
    $ pecl install fileinfo
    LocalSettings.php に以下を追加。
    $wgLoadFileinfoExtension = true;
  • 以下の2つのファイルを編集(パッチは自己責任でお願いします。自分は責任とりません)。 [MediaWikiのインストールディレクトリ]/includes/specials/SpecialUpload.php を編集(以下、patch)
    --- testwiki.orig/includes/specials/SpecialUpload.php   2008-12-23 16:32:33.000000000 -0800
    +++ testwiki/includes/specials/SpecialUpload.php 2008-12-23 16:35:26.000000000 -0800
    @@ -1324,7 +1324,7 @@
    function verify( $tmpfile, $extension ) {
    #magically determine mime type
    $magic = MimeMagic::singleton();
    - $mime = $magic->guessMimeType($tmpfile,false);
    + $mime = $magic->guessMimeType($tmpfile, $extension);

    #check mime type, if desired
    global $wgVerifyMimeType;
    [MediaWikiのインストールディレクトリ]/includes/MimeMagic.php を編集(以下、patch)
    --- testwiki.orig/includes/MimeMagic.php        2008-12-23 16:32:08.000000000 -0800
    +++ testwiki/includes/MimeMagic.php 2008-12-23 16:30:19.000000000 -0800
    @@ -589,6 +589,16 @@
    $m = trim( $m );
    $m = strtolower( $m );

    + if ($m === 'application/msword') {
    + if ($ext === 'xls') {
    + $m = 'applicatoin/vnd.ms-excel';
    + wfDebug( __METHOD__. ": mime type has been changed to $m because the extension is $ext.\n");
    + } elseif ($ext === 'ppt') {
    + $m = 'applicatoin/vnd.ms-powerpoint';
    + wfDebug( __METHOD__. ": mime type has been changed to $m because the extension is $ext.\n");
    + }
    + }
    +
    if ( strpos( $m, 'unknown' ) !== false ) {
    $m = NULL;
    } else {
オススメは2つ目かな。理由はちゃんと判定できるから。1つ目のやり方だと、Excel/PowerPointもWordに判定されちゃうし。言い忘れたけど、MediaWiki のバージョンは 1.13.2。 試してないからわからないけど、同じ現象が、CentOS 5、Fedora 6とかでも起こると思う。
本日のツッコミ(全6件) [ツッコミを入れる]
_ cialis (2009-12-11 23:01)

Hello!<br><a href="http://aixypeo.com/ayrxsa/1.html">buy cialis</a> ,

_ cialis (2010-02-05 17:41)

Hello!<br><a href="http://apxoiey.com/qoxvrt/1.html">cialis</a> ,

_ viagra (2010-03-11 13:17)

http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra 袤

_ Lcylmyye (2010-03-29 15:37)

http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra buy viagra

_ xqazWZD (2010-04-20 11:19)

WmoBYbyk

_ viagra (2010-04-25 09:57)

weLbMHFY http://roanqq.com/ <a href="http://ahftdl.com/ ">YgFMdtP</a> [url=http://uknqdb.com/]YgFMdtP[/url]

[]