Pydio8で日本語ファイル名が文字化ける

ファイルのパブリックリンクもできるようになり、めでたしと思っていたら、日本語ファイル名がすべて文字化けてしまう問題が発生。

現在使用しているPydioバージョンは、8.0.2

pydio-japanese02

例えば、あ.txtというファイル名(中身も日本語)をアップロードすると、以下のようにファイル名が文字化けてしまう。(中身は日本語のままでOK)

pydio-japanese01

設定用のphpファイルには以下のように設定している。多くのほかの日本語版構築しているサイトでも同様の設定なので、問題なさそう。

#bootstrap_conf.php
define("AJXP_LOCALE", "ja_JP.UTF-8");
#bootstrap_context.php
setlocale(LC_ALL, 'ja_JP.UTF-8');

プログラムソースを調べてみることにする。

ファイルのアップロード処理は、プラグインのplugins/access.fs/FsAccessDriver.phpuploadActionで行っている。$requestクラスのデータを受け取って、ファイル名のチェックを実施し、最終的にmove_uploaded_fileを行っている。

アップロードファイル名は、$uploadedFile->getClientFileName()で取得できるので、ファイル名あ.txtのファイルをアップロードしてログ出力してみる。(450行目あたり)

$uploadedFile = array_shift($uploadedFiles);
try{
    // CHECK PHP UPLOAD ERRORS
    InputFilter::parseFileDataErrors($uploadedFile, true);
    error_log("[getClientFileName]=".$uploadedFile->getClientFileName());
[Sun Dec 31 21:45:37.687694 2017] [:error] [pid 25749] [client 192.168.1.12:59645] [getClientFileName]=\xc3\xa3\xc2\x81\xc2\x82.txt, referer: http://xxx.hoge.com/pydio/ws-my-files/

という文字のUTF-8バイト列は、\xe3\x81\x82であるはずだが、\xc3\xa3\xc2\x81\xc2\x82という文字列が出力されている。

色々調べると、UTF-8文字列を誤認識してLatin1"ISO-8859-1"と認識し、この文字列をさらにUTF-8に変換したときの文字列らしい。

なので、ISO-8859-1からUTF-8に逆変換した$convstrを使った処理に変更してみる。

$convstr = mb_convert_encoding($uploadedFile->getClientFileName(), "ISO-8859-1", "UTF-8");
//$userfile_name= InputFilter::sanitize(InputFilter::fromPostedFileName($uploadedFile->getClientFileName()), InputFilter::SANITIZE_FILENAME, true);
$userfile_name= InputFilter::sanitize(InputFilter::fromPostedFileName($convstr), InputFilter::SANITIZE_FILENAME, true);

念のため、apache2を再起動(PydioのリロードでもOK)して、日本語ファイル名のファイルをアップロードしてみる。

pydio-japanese03

無事、文字化けせずにアップロードできるようになった。

pydio-japanese04

ほかの日本語処理はうまく動作しているので、自身の設定(php.iniなど)が怪しいとは思うが、いろいろやって万策尽きたので、プログラムを直接編集することになった。

ほかにもアップロードの入り口がいくつかあるので、その箇所にも対応が必要かもしれないが、今のところ確認してない。

ほかにも、PDFファイルのプレビューが失敗する現象があるが、外部ウィンドウで表示すると、正しく表示できるので、良しとしている。

おおむねインタフェースも使いやすいし、データ保管もシンプルで気に入っている。