WindowsをサーバのMediaWikiに日本語ファイル名のファイルがアップロード出来ない事象の解決方法
MediaWikiをWindowsサーバーにインストールし稼働する場合、アップロード機能を使用すると日本語ファイル名のファイルはアップロードできない。
エラーメッセージ:
このウィキではファイル名に特殊文字を使用できません。
ソースコードを「このウィキではファイル名に特殊文字を使用できません。」で検索すると、「ja.json」が見つかりました。
「ja.json」の中の該当キーワード「windows-nonascii-filename」で検索すると、「UploadBase.php」にたどり着きました。
該当箇所:
// Windows may be broken with special characters, see bug XXX
if ( wfIsWindows() && !preg_match( '/^[x0-x7f]*$/', $nt->getText() ) ) {
$this->mTitleError = self::WINDOWS_NONASCII_FILENAME;
$this->mTitle = null;
return $this->mTitle;
}
以上を読みますと、Windowsサーバーの場合、指定文字以外の文字が入っていればアップロードできないよう、制限されていることがわかりました。
以上のソースコードをコメントアウトすると、アップロードできました。
コメントアウト結果:
// Windows may be broken with special characters, see bug XXX
//if ( wfIsWindows() && !preg_match( '/^[x0-x7f]*$/', $nt->getText() ) ) {
// $this->mTitleError = self::WINDOWS_NONASCII_FILENAME;
// $this->mTitle = null;
// return $this->mTitle;
//}
なぜ指定文字を限定したのでしょうか、いったんアップロードしてみました。
結果、ファイル名が文字化けになっている事象が発生しました。
文字化けするから、制限がかけられてのでしょうか。
仕事上に必要なので、文字化けしない方法を探りました。
結果、下記の修正を行い、文字化けを解消しました。
修正内容:
mb_convert_encoding関数を使用してファイル名の文字コードをSJISへ変換する。
修正ファイル:FileRepo.php
修正箇所1:
function publishBatch
…
…
$publicRoot = $this->getZonePath( 'public' );
$dstPath = "$publicRoot/$dstRel";
$archivePath = "$publicRoot/$archiveRel";
修正内容:
上記のソースコードのしたに下記内容を追加。
$dstPath = mb_convert_encoding( $dstPath, 'SJIS-win', 'auto');
$archivePath = mb_convert_encoding( $archivePath, 'SJIS-win', 'auto');
修正箇所2:
function deleteBatch
…
…
$deletedRoot = $this->getZonePath( 'deleted' );
$archivePath = "{$deletedRoot}/{$archiveRel}";
修正内容:
上記のソースコードのしたに下記内容を追加。
$srcPath = mb_convert_encoding( $srcPath, 'SJIS-win', 'auto');
$archivePath = mb_convert_encoding( $archivePath, 'SJIS-win', 'auto');
修正箇所3:
public function getFileProps( $virtualUrl ) {
$path = $this->resolveToStoragePath( $virtualUrl );
//return $this->backend->getFileProps( array( 'src' => $path ) );
return $this->backend->getFileProps( array( 'src' => $path ) );
}
修正後:
public function getFileProps( $virtualUrl ) {
$path = $this->resolveToStoragePath( $virtualUrl );
//return $this->backend->getFileProps( array( 'src' => $path ) );
return $this->backend->getFileProps( array( 'src' => mb_convert_encoding( $path, 'SJIS-win', 'auto') ) );
}
以上の修正によって、アップロード、古い版への差し戻し、削除が正常になりました。