その後、残念ながらというか、予想通りというか、
全角文字を含むファイルをお客様がアップするという事態が、度々起こってきました。
必要に迫られ、なんとかエラーにしてはじくところまでは、たどり着きましたので、ご報告します。
●全角文字が削除される原因
PHPの「basename」にバグがあったようです。
http://blog.jojo.jp/?eid=632412
http://bugs.php.net/bug.php?id=37738
どうも、PHPのバージョン5.2.2より以前のバージョンでは、basenameやpathinfoは、日本語などのマルチバイト文字を扱えないようです。
#そういえば、今まで、basenameはよく使っていましたが、マルチバイト文字のファイル名を扱うという経験はなかった…
●全角文字等が入っているファイル名をエラーにする方法
リソースブラウザのアップロード処理
「manager/media/browser/mcpuk/connectors/php/Commands/FileUpload.php」
を直接変更します。
まず、72行目の「basename」を置き換えます。
$filename=basename(str_replace("\\","/",$_FILES['NewFile']['name']));
↓ 以下のように変更します。
$filename=end(explode('/',str_replace("\\","/",$_FILES['NewFile']['name'])));
その直後に、以下のように、文字種の判定を挿入します。
if(preg_match('|^[a-zA-Z0-9\._\-\\/]+$|', $filename)){
元の186~189行目の「Unable to determine…」のエラーメッセージをセットしている箇所と、
元の191~194行目の「This file exceeds…」のエラーメッセージをセットしている箇所の間に、
以下のように、新たに、ファイル名に対するエラーメッセージをセットするコードを挿入します。
} else {
$disp="202,'Disallowed file name.'";
}
結果、このあたりのソースコードは、以下のようになります。
} else {
//No file extension to check
$disp="202,'Unable to determine file type of file'";
}
} else {
$disp="202,'Disallowed file name.'";
}
} else {
//Too big
$disp="202,'This file exceeds the maximum upload size.'";
}
#私は、ついでに日本語のエラーメッセージを入れちゃったりしていますが…
#(日本語を入れるときは、UTF-8で保存する必要があります。元のファイルはASCIIなので)
ついでに、70行目のファイルサイズチェックのバグも直しておきましょう。
if ($_FILES['NewFile']['size']<($typeconfig['MaxSize']*1024)) {
↓ 以下のように変更(「*1024」を削除)します。
if ($_FILES['NewFile']['size']<($typeconfig['MaxSize'])) {
2009-03-24追記)
さらに改良したソースを下記にアップしました。
http://modxcms.com/forums/index.php/topic,34199.0.html