日本語のみのファイル名で問題が起こる件について

2013年5月5日 at 13:39

concrete5では、以前から日本語のみのファイル名をアップロードすると拡張子だけのファイル名ができあがるという問題があります。concrete5日本語プロジェクトでは、concrete5日本語版をメンテナンスしていますが、concrete5本家版とできるだけ離れず、修正を最小限に抑えようという方針から、この部分の問題についてのパッチを適用してきませんでした。

しかし、最近やはりこれは問題ではないかという議論が高まって来ました。ただ、コアメンバー内での議論では日本語版に取り入れるまでには至りませんでした。そこで、コードを公開し、広くテストを行なっていただくとともに、concrete5日本語版は日本語ユーザーコミュニティー皆のものですので、ぜひ日本語版に取り入れるべきかのご意見を、お気軽に、いただきたいと思っています。

議論の発端になったissue
http://github.com/concrete5japan/concrete5/issues/124


■問題点の整理

concrete5は、ファイル名をアップロードする際、半角スペースをアンダーバー(_)に変換し、アルファベットと数字以外の文字を消すという処理を行なっています。処理後のファイル名に変換してサーバー上にアップロードし、データベースにも処理後のファイル名で登録されます。ところが、この処理を行うと当然ながら、アルファベット、数字、半角スペース以外の文字だけで構成されたファイル名の場合、全ての文字が消えてしまいます。拡張子だけが残ります。ドット(.)ではじまるファイル名は、環境によっては隠しファイルとして扱われますので、問題になります。


■解決策

日本語のファイル名で保存し、ダウンロードする際にも日本語のファイル名のままであることが理想だと考えます。デメリットとしては、文字化けする可能性が考えられます。

次善策としては、ファイル名をmd5でハッシュ化するなどしてアルファベットと数字のみのファイル名に変換するという手段があります。アルファベットだけにしてしまえば文字化けの心配はありません。デメリットとしては、暗号化してしまうと元のファイル名に戻すことができなくなります。ITリテラシーの低いユーザーにとっては、文字化けしているのと変わらない状態です。ただし、WordPressなどメジャーなCMSはこっちの方法を取っているようです。

環境によっては文字化けするかもしれませんが、現在のファイル名が消え失せるという状態よりはマシだと思いますので、理想のパターンの方で修正パッチを作りました。
http://github.com/hissy/c5_multibyte_patch/blob/master/helpers/file.php

できれば色々な環境でテストしていただければ嬉しいです(Linuxサーバー、Windowsサーバー、各種ブラウザ)。問題を発見したら当スレッドにコメントいただくか、アカウントをお持ちであればリンク先のGithubレポジトリのissueを追加していただいてもかまいません。よろしくお願いいたします。


■パッチのインストール方法

上記リンク先の「Raw」ボタンをクリックすると、ブラウザでファイルのソースが表示されますので、別名で保存 → file.php という名前で保存してください。このファイルをconcrete5をインストールしたディレクトリーの helpers/ フォルダー(ご自分で何かアップロードしていない限り空のはずです)にアップロードしてください。 concrete/helpers/ ではないので注意してください。もしパッチを削除したい場合は、アップロードしたファイルを削除すればOKです。既存のファイルを上書きしていないので、影響はありません。

※ パッチのインストールはあくまで自己責任で行なってください。まだconcrete5日本語プロジェクトとして公式にリリースしているものではなく、個人的に作成したベータ版です。

タグ: 不具合

Re: 日本語のみのファイル名で問題が起こる件について

2013年5月6日 at 8:19
問題点がもうひとつあります。これが大きい問題だと思います。

concrete5は現在 バックアップはFTPなどでパソコンへファイルをダウンロードするという形になりますが、windowsで拡張子のみのファイルがあるとファイルが壊れる可能性があります。(僕は画像ファイルがこわれました。)ですので、バックアップファイルで復元ができません。
 

Re: 日本語のみのファイル名で問題が起こる件について

2013年5月9日 at 19:49
いつも大変お世話になります。

「日本語ファイル名」に対応、大賛成です。

過去に何度かトラブルを経験しました。

【ケース1】大阪府堺市 50代 女性
大量の日本語名Jpegファイルをアップロード。
それを使ってページを作成していた。
僕が気づいた時には後の祭り。
ファイルマネージャーを覗くと、ファイル名の消えた「.jpg」のオンパレード。
どれがどのファイルかまったく区別がつかず、
数がかなり多かったので大変難儀しました。

【ケース2】兵庫県西宮市 60代 男性
普段から「ファイル名はアルファベットと数字しか使えません。
日本語のファイル名は、変更してからアップロードして下さい!」
と口を酸っぱくして言っていた。

或る時「不具合があるから見てくれ」と言われ調査すると、
「日本語のみファイル名」が原因であった。
「だから、日本語でファイル名は駄目なんですってば!」と
言うと、キョトンという顔をされた。
どうも言っていることが理解できないらしい・・・。

以上の経験から、
「一般の人に、日本語ファイル名を禁止するのは無理!」
と思いました。

で、こちらの情報を元に改造をおこないました。

「ファイル名のマルチバイト文字対応
http://concrete5-japan.org/community/forums/translate/post-1540/

確か完璧ではなかった(ファイルダウンロード時に文字化け?)と
記憶していますが、状況は大幅に改善されました。

また、こちらの情報も参考にさせていただきました。

漢字ファイル名のファイルをアップロードしたときファイル名を正しく表示させる方法
http://concrete5.tomo.ac/osusumeblock/extendedform/tomoac-form5/kanjifilename/

という訳で、「日本語ファイル名」対応は大賛成です。

よろしくお願いします。
 

Re: 日本語のみのファイル名で問題が起こる件について

2013年5月9日 at 20:12
ありがとうございます。過去スレッド、あったんですね。
当時のぼくはコードまでコミットしていませんでした…。

Punycodeは避けたほうが良いかと思います、Taoさんの指摘する通りです。

また、サーバー上にハッシュ化して保存し、
元のファイル名を別途保存するという処理にするには修正範囲が大きくなります。
この方向で行くのであれば、ファイルアップロードの処理を書きなおして本家にプルリクエストすることになります。
やろうかなとも思いますが…

ぼくが作ったものはまずファイル名のエンコーディングをオートでUTF-8に変換します。
これはconcrete5をインストールする環境はUTF-8だという前提を暗黙のものとしています。
この時点で若干あやしい。
それからダウンロードの処理の際、本家の実装ではマルチバイトに対応していないので
RFC 2231 の規約に沿った実装に修正しています。
ただ、この標準規約をIEのバージョンによっては無視するらしいです。
きちんと検証できていないのですが。

いずれにしても、本家はURLのマルチバイト対応について全く対応する予定はなさそうです。
URLは日本語を使わなくても、ファイル名は日本語にする人のほうが多いでしょう。
個人的にはURLのマルチバイト対応よりも優先度を上げて本家にプッシュしていくべきかと思いますが、
なにせ本家の人たちは検証ができないと思うので、こちらからできあがった解決策を送りつけるしか無いのではないかと思います…。