@洪流Blog
space ホーム space|space ユーザログイン
space
 現在位置:技術 >> サイト構築 >>WindowsをサーバのMediaWikiに日本語ファイル名のファイルがアップロード出来ない事象の解決方法

WindowsをサーバのMediaWikiに日本語ファイル名のファイルがアップロード出来ない事象の解決方法
該当バージョン: MediaWiki 1.23.1
投稿者:u153
作成日時:Thursday, September 8, 2016

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') ) );
   }

以上の修正によって、アップロード、古い版への差し戻し、削除が正常になりました。

 

loginユーザメニュー
  ユーザログイン  

     トップ↑

space
@洪流Blog 最新コンテンツ サイト情報 権利情報 提携リンク
Copyright ©2002-2018 洪流  Mobileモード    中国語メニュー(追加中)
OneIDSystem Ver:1.5.0.1.2 Powered by:OneID.id