Moodle で日本語ファイル名のアップロードを禁止する

日本語などのマルチバイトを名前に含むファイルをアップロードすると、WWW ブラウザによってはダウンロード時にファイル名の文字化けを起こします。ということで、マルチバイトファイル名でのアップロードを禁止してみました。

修正は少なめ。

lib/uploadlib.php の validate_file() を修正します。以下のようにコードを追加。

        if (empty($file)) {
            return false;
        }
        // ここから
        if (!mb_check_encoding($file['name'], "ASCII")) {
            $file['uploadlog'] .= "\n".get_string("multibytefilename");
                        return false;
        }
        // ここまで
        if (!is_uploaded_file($file['tmp_name']) || $file['size'] == 0) {
            $file['uploadlog'] .= "\n".$this->get_file_upload_error($file);
            return false;
        }

get_string() で取得するエラーメッセージを lang/ja_utf8/moodle.php と lang/en_utf8/moodle.php に追加します。

$string["multibytefilename"] = '日本語を含む名前のファイルはアップロードできません。ファイル名は半角英数字記号のみ許可されています。';

あやしい英語ですがご勘弁…。

$string["multibytefilename"] = 'Multi-byte character(s) is used in this file name. A file name must consist of ONLY ASCII characters.';

mb_check_encoding() がちょっとあやしかったり、ASCII でええんかい、という話もありますが、とりあえず…。

(2011年04月15日 追記)

リネームも禁止しとかないと。 files/index.php を以下のように修正。

        case "rename":
            if	(($name != '') and confirm_sesskey() ){
                html_header($course, $wdir);
                $name = clean_filename($name);
               if (!mb_check_encoding($name, "ASCII")) {
                    echo "<center>" . get_string("multibytefilename") . "</center>";
                } else if (file_exists($basedir.$wdir."/".$name)) {
                    echo "<center>Error: $name already exists!</center>";