Headless CMS Cockpit 公式のDockerイメージを使うと、日本語ファイル名が使えない問題

Headless CMS Cockpit と NuxtJSを使用したウェブサイトを作っているのですが、日本語のファイルをアップロードすると、ファイル名のダブルバイトの部分が削除されて半角英数のファイル名に化けてしまいました。

Cockpitのソースコードを読んでみたところ、ファイル名はphpのbasename関数で抽出していることが分かりました。PHPの公式サイトを確認すると、basename関数はsetlocaleで挙動が変わるとのこと。なるほど、以下のようにsetlocateを追加してやれば良いということですな。

setlocale(LC_ALL, 'ja_JP.UTF-8');

実行時に Cockpitの設定ファイル「config.php」がincludeされるので、このファイルの先頭にsetlocaleを追加すれば、ソースファイルを触ることなく対処できそうです。

で、config.phpを書き替えて、コンテナを起動し直してみたところ、あらら…、ファイル名の不具合は解消しません。なんでだよ、むむむ…。

しばし考えて、もしやとCockpitのコンテナに入って、ロケールを確認してみると…

# locale -a
C
POSIX

なるほど、「ja_JP.UTF-8」が入ってません。これが原因ですね。

そんなわけで、公式イメージにロケールを追加したDockerfileを書いてみました。

ARG COCKPIT_VERSION=0.9.2
 
FROM agentejo/cockpit:${COCKPIT_VERSION}
 
RUN apt-get install -y locales \
  && echo "ja_JP UTF-8" >> /etc/locale.gen \
  && locale-gen
 
COPY config.php /var/www/html/config/config.php
COPY ja.php /var/www/html/config/cockpit/i18n/ja.php
 
RUN echo "\n\nphp_value post_max_size 1024M" >> /var/www/html/.htaccess \
  && echo "\nphp_value upload_max_filesize 1024M" >> /var/www/html/.htaccess

せっかくなので、カスタマイズしたconfigファイルと、管理画面の日本語表示用のファイルを読み込んで、さらにアップロード可能なファイルサイズの上限を1GBにアップしてます。

ちなみに、Cockpitの日本語化の方法は公式サイトにやり方が書いてあるので、説明する必要はないかも知れませんが、一応説明しますと、このリポジトリから必要な言語ファイルを持ってきて、「 /config/cockpit/i18n 」ディレクトリに配置してやればOKです。管理画面でアカウント毎に言語を設定できるようになります。

で、「config.php」の先頭にsetlocaleを追加してと。

<?php

setlocale(LC_ALL, 'ja_JP.UTF-8');  // ← 追加する!

$configs = [];

if (!empty(getenv('COCKPIT_SESSION_NAME'))){
  $configs['session.name'] = getenv('COCKPIT_SESSION_NAME');
}

if (!empty(getenv('COCKPIT_SALT'))){
  $configs['sec-key'] = getenv('COCKPIT_SALT');
}

…

…

Dockerイメージをbuildして起動すれば、バッチリ日本語ファイルが使えるようになりました!\(^o^)/

シェアする

  • このエントリーをはてなブックマークに追加

フォローする