kenyo's diary
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といったエントリがあるんだが、file コマンドの判定結果が、application/msword にしかならないから、拡張子が".doc"じゃないとエラーになる。そのため、タイトルのエラーメッセージが出る。 では、どうすればいいかというと、とりあえずでよければ以下3つのどれか。
application/vnd.ms-excel xls
application/vnd.ms-powerpoint ppt
- [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
[MediaWikiのインストールディレクトリ]/includes/MimeMagic.php を編集(以下、patch)
+++ 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;--- 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 {
[]

Hello!<br><a href="http://aixypeo.com/ayrxsa/1.html">buy cialis</a> ,
Hello!<br><a href="http://apxoiey.com/qoxvrt/1.html">cialis</a> ,
http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra viagra 袤
http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra buy viagra
WmoBYbyk
weLbMHFY http://roanqq.com/ <a href="http://ahftdl.com/ ">YgFMdtP</a> [url=http://uknqdb.com/]YgFMdtP[/url]