Posted by katow30 on July 25, 2009 at 9:47am
社内イントラで利用する文書管理サーバを構築できないか、Drupal-6.13日本語版にIMCEモジュールを追加してみました。
http://drupal.org/project/imce
http://ufku.com/drupal/imce
バージョン 6.x-1.2
上記サイトを参考に、一応動作させることができました。WinXP上のXAMPPです。
ただしやはりというべきか、日本語のフォルダ名、ファイル名については表示が文字化けしてしまいます。
#ディレクトリツリー部分、ファイル一覧部分、ログ表示部分ともに
結構IMCEは頑張ってくれて、表示が文字化けしても、ファイル一覧の取得/文字化けしたファイルの削除/文字化けしたフォルダ以下のファイル一覧の取得は、ともに正常に動作します。惜しいなあと思うのですが…
IMCEの配布元サイトをざっとみても他国語対応っぽい表記は見当たりません。
どなたか、IMCEを利用して日本語ファイル名表示や直接ダウンロードに成功された方はいらっしゃいませんでしょうか。
Comments
DB? 質問
Drupalはまだあまり解らないですが、phpでの原因を明らかにしようと試みます。
Imceはファイル名をデータベース上で管理してそうですか(表示するときにデータベースからファイル名を読み込んでそうですか)? もしそうならphpmyadminでそのImceテーブルを見たとき、ファイル名は文字化けしてますか? (データベースにファイル名が入力される前、もしくは後で文字化けが発生してるのか)
Imceで見てるファイルはすべてユーザがアップロードした物なのでしょうか?それかディレクトリを自動的に呼び込んだりもするのですか?
phpでのファイル名文字化けの原因調べてみます。
2パターンテストしました
IMCEでは、MySQLのデータベース内のfilesテーブルにファイル名情報を格納しているようです。
●「新しいファイル.txt」をアップロードした場合
1)filesテーブルの内容は、filename列の値が空のまま(英数ファイル名なら入っている)で、filepath列の値が「sites/default/files/○○○.txt」になる筈が「sites/default/files/」で終わってしまう
#ちなみにfilename,filepathの文字コードはutf8です
2)実際の sites/default/filesフォルダには、「新しいファイル.txt」がアップロードされているが、実体ファイルのファイル名自体が既に文字化けしている(元がSHIFT-JISのファイル名を文字コード変換なしでUTF8として扱ってしまう?)
3)アップロード結果の表示画面では、sites/default/files フォルダ以下の情報が、文字化けした状態で表示される
●sites/default/files の中に直接「新しいフォルダ」を作成した場合
前項の1)のfilesテーブルには特に情報は反映されませんが、3)の表示画面では再読み込みすればフォルダの実体は発見できます。ただし文字化けしています。
→以上から、IMCEでは画面表示の際は1)のfilesテーブルの内容は使わずに実態のファイルシステム上の情報をPHPで取得しているが、その処理が文字化けのせいで失敗しているのが最初の問題ではないかと思います。
もしかすると3)の問題を解決すれば1)のfilesへのテーブルは正常に行われるとか…
filesテーブル
この場合filesテーブルの内容はアップロード時に一行追加されているのであれば 1) と3)は原因似てそうであるにしろ別問題として扱った方がいいと思います(編集箇所は別)。filesテーブルはIMCEでは基本的にどういう意味で機能してるのか疑問があります、あまり意味無さそうなんで(たぶん、filesテーブルに一通りファイル名があった方が透明性があるというような意味でテーブル登録?他モジュールとの連動など)。日本語ファイル名の場合、値が空なのは今のところコードを見ないと原因は不明ですが文字化けと関係ないかもしれません。
”filesテーブルの内容は使わずに実態のファイルシステム上の情報をPHPで取得しているが、その処理が文字化けのせいで失敗しているのが最初の問題ではないかと思います。” の分析は正しいと思います。調べて見ます。
readdir 関数
page.inc 908行、subdir.inc 83行 にある $file = readdir($handle) が原因かその後のコード問題だと思います。readdirが日本語ファイル名に対応してないのではと考えていますが、”$file”部分を日本語に直接書き変えて
$file = ’日本語ファイル’(試しに)と、文字化けしないで何か表示されたら readdirが日本語ファイル名に対応してないということになります。
プログラマの視点で言うとファイル名は空白なしのAlphnumeric文字のみというのが基本なのですが、そこからいろいろ進化して日本語ファイル名という考え方があるのでしょうが、私個人はOSそれぞれが対応できるのかとそういう意味で恐ろしくて使用したことないです(昔日本語ファイル名のファイルを開けられなかった事もあり)。
readdirが文字化けの原因でなければ何とかなるかもしれません。具体的にreaddirで必ず日本語ファイル名は文字化けするとはっきりネットで書かれてないのも気になります。
プログラマの視点で
同意。
Aki Iwata
FOREST & trees
http://www.forest-and-trees.com/
Aki Iwata
FOREST & trees
MySQLのエンコーディングエラー処理
MySQLの文字エンコーディングのチェックも気になります。バージョンによっては、エラーが発生した場合に、それ以降の文字列をごっそりと消してしまうことがあるようです。
すでにマクロ的なハウツーは既出ですが、PHP側の処理で文字エンコーディングを合わせてやる必要があります。文字エンコーディングが、ファイル名やファイルの中身あるいはDBのインターフェースなどと、内部エンコーディングが異なる場合は、それぞれストリーム毎に、入力と出力について、別々に整合性が合うように注意しておく必要があります。
--
J.kuwamura
J.kuwamura
IMCEの機能は
画像ファイルをアップロードし、HTML Editorと連携してnode貼り付けをサポートすることが基本です。
image以外の文書管理機能はおまけと思った方がよいですよ。
ファイル名はそのまま[img]タグのsrc属性にURIとして利用することを前提に作られていますから、
貼り付けたい画像ファイル名に全角日本語ファイル名は避けた方がよいですね。
多言語化されたシステムだとしても、問題が多いです。
URLエンコードの問題もありますし、その前にDrupal内部の文字コードはUTF8、WindowsはSJISですから、
なおさらそのままでは無理でしょう。
ただ、社内で複数の方が使用するばあい、全角日本語ファイル名を拒否できないかもしれません。
2つ方法が思いつくので参考にしてください。
◎ 一つは「Transliteration」モジュールを使って文字を変換してしまう。
http://drupal.org/project/transliteration
上手く変換できなければ、意味のない文字列になる可能性はありますが、ASCII文字列になるので文字化けはなくなります。
◎ 二つめは IMCEは画像を挿入する使い方に限定して、文書管理はその目的用に作られたモジュールを採用する。
「Web File Manager」というモジュールがあります。
http://drupal.org/project/webfm
これはおすすめです。とても良くできていて、すごく便利でキレイな画面ですよ。
どちらにしても、画像ファイル名はASCII文字列が安全です。
Transliteration についての補足
僕の理解では、このモジュールはファイル名に含まれる各漢字を中国語読み(ピンイン?)に変換し、さらにその読みをアルファベットに置き換えます。
Transliteration のこのような仕様のため、変換後のファイル名は日本人にとって非常に分かりづらいものになります。ですから、せっかくの IMCE によるファイルブラウザ機能があまり役に立たなくなるおそれがあります。
やはり、ここは数年前〜十数年前に戻ったつもりで、英数字+ダッシュ+アンダースコアのみのファイル名にすることをお勧めします。
Aki Iwata
FOREST & trees
http://www.forest-and-trees.com/
Aki Iwata
FOREST & trees
transliterationについて
transliterationのモジュールはaiwataさん言ったとうりに中国語読みに変換しするが「英数字+ダッシュ+アンダースコアのみのファイル名にすることをお勧めします」だけで解決するとちょっと不安があると思います。万が一ファイル名の変更忘れたらtransliterationモジュールがあればファイル名は自動的に変更されて安心だと思います(読みにくい分は残念ながら)。
IMCEで使えるかどうか分かりませんが下記のモジュールがfilefieldでアップローヅされたファイルを自動的にファイル名を変更出来るモジュールです:
filefield_paths http://drupal.org/project/filefield_paths
imagefield_tokens http://drupal.org/project/imagefield_tokens
file_aliases http://drupal.org/project/file_aliases ※これはIMCEで使えますかなぁ
あとは下記のモジュールも必要かな
token http://drupal.org/project/token
pathauto http://drupal.org/project/pathauto
か
transliterationが使ってるPHP libraryに日本語のサポートを作ればね;)
とことん追求したスレッド
この問題はWIndowsの場合だけだったら。
(ゲストとしてログイン)(原因を知るのに凄く参考になりそうです、完全解決には至ってないようですが)
http://moodle.org/mod/forum/discuss.php?d=71061
http://moodle.org/mod/forum/discuss.php?d=71413#p319955
Firefoxでも試してみてください。
後、php.iniや.htaccessをいじくったらこの類の問題は解決する場合があります。目標はすべてUTF-8でシステムが稼働することです。 (phpで日本語扱う場合は私にとってこの作業は必須ですが、皆さんそうでもないのでしょうか?)
(.htaccessでの参考)
php_value mbstring.language Japanese
php_value mbstring.detect_order auto
php_value mbstring.http_input auto
php_value mbstring.http_output UTF-8
php_value mbstring.internal_encoding UTF-8
php_value mbstring.substitute_character none
http://www.google.com/#hl=en&q=php+%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%80%80%E5%AF%BE%E7%AD%96&aq=f&oq=php+%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%80%80%E5%AF%BE%E7%AD%96&aqi=&aq=&oq=&aqi=&aq=f&oq=&aqi=&fp=_cIR_Wyh16k
多数コメントありがとうございます
どうも、元記事の投稿者のkatow30です。
皆さんより頂いた情報から、
・PHPの実装の部分で日本語ファイル名のエンコード問題を吸収しきっていない
・IMCEはあくまで簡易実装
・Transliteration、Web File Manager他の代替手段がある
と言うことが判りました。ありがとうございます。
それを踏まえて、ちょっと私も直球でこの方向での解決は自分のスキル的に難しい(PHP初心者)と考えまして、
別な方向で再検討しております。
そもそも私が文書管理を構築したいと思った目的は
・既に社内で利用するWindowsファイルサーバにたくさん保存された日本語ファイル名のファイル群、フォルダ群をそのままWebで公開
・かつ、それらをタグ付け管理したい
と言うものでした。元記事ではそこまで書いておらず申し訳ありません。
なので、既存ファイルのファイル名変更は原則不可な上に、よく考えたら全ファイルを1点ずつDrupal経由でアップロードする作業もできれば避けたいです。
で、代わりに
・既存ファイルサーバのルートフォルダから、そのままApache任せで公開
→Apache+ブラウザ側の実装次第ですが、ある程度日本語ファイル名含んだURLへのアクセスが可能なようです(半角空白とかは%20になっちゃいますが、Firefoxだとそれも起きなかった)
・この日本語ファイル名含んだURLのテーブル(ブックマーク?)をDrupalの機構を利用してノードとして登録
・このノードをタクソノミ管理
というパターンを検討し始めました。
URL集を溜めるのに良いモジュールを探すかcckで作成ですかね。
余裕があればせっかくXAMPPはデフォルトでWebDAVが動くのでそちらとの連携も考えてみます。
参考モジュール/installation profile
http://drupal.org/project/fileserver
http://drupal.org/project/fileframework
http://drupal.org/project/dav
http://drupal.org/project/filerelationsserver
http://drupal.org/project/relations
http://drupal.org/project/rdf
下記は英語になりますのですみません。※先のモジュールを使ってprofileを作ったプロジェクト/会社
http://dc2009.drupalcon.org/session/powering-collaboration-distributed-e...
http://drupal.org/project/openband
取り急ぎ、ご参考まで。