Win2008R2+Drupal7で、アップロードした実体ファイル名が文字化け

Events happening in the community are now at Drupal community events on www.drupal.org.
wataru.kato's picture

drupal7の最新バージョンで「drupal_basename」他のメソッドが無事導入されているのを確認しまして、長年やりたかった社内情報共有サイトの構築に着手しております。

以前のdrupal6では、日本語ファイル名のファイルを登録しようとすると最初のファイル情報のDBへの登録時点で値が空になってしまう現象がありましたが、これが今回は正常に文字化けなしでDB登録できていることを確認できました。

しかし私の構築環境が

・Windows2008R2
・XAMPP 1.7.4

のせいか、たとえば

日本語ファイル名のテスト.txt

をコンテンツに添付してアップロードすると正常完了するのですが、
リンクボタンをクリックすると日本語のファイル名のみ「Not Found」となり、
リンク先が見つからないとなります。

添付ファイルはPublicで公開しているのですが、

sites/default/files

を見ると、先のファイルは

譌・譛ャ隱槭ヵ繧。繧、繝ォ蜷阪・繝・せ繝・txt

というファイル名になり、エクスプローラーからは文字化けしたファイル名になっています。
これが原因と思われます。

ためしにこの状態から、直接ファイル名を元の日本語ファイル名にリネームしてやると、きちんとリンクをクリックするとダウンロードできるようになります。
しかし今度はDrupal7側の削除などの操作時に、元ファイルが見つからない、要するに紐付けが切れた状態になり失敗してしまいます。

おそらくDrupalのAPI(PHP)で行っているファイル名解決のロジックと、
普通にリンクをクリックした際のブラウザ側のリンク先の名前解決のロジックとが
すりあっていないので、どっちこっちにしかならない状態かと考えました。

同じような現象で悩んでいる方はいらっしゃいませんでしょうか。

また私としては、最良の解決は最初にアップロードファイルを保存した際にそこで日本語ファイル名が文字化けしていない状態であることだと思うのですが、何か解決策はないでしょうか。

includes/file.inc

にFile API?関係の関数が集まっているように読めましたので
多少

$file->uri      = mb_convert_encoding($_FILES['files']['tmp_name'][$source], "SJIS", "AUTO");

などの処理を挟んでみたりもしたのですが、上手に解決できません。

Comments

恥ずかしながら自分は日本語の Drupal

dokumori's picture

恥ずかしながら自分は日本語の Drupal サイトを作ったことがないため、経験をもとにアドバイスできないのですが、以前このフォーラムで同様の質問があったのでリンクを張っておきますね:

http://groups.drupal.org/node/24625

また、ここ(https://bugs.php.net/bug.php?id=37738 )の、2011年4月11日に加えられたコメントも参考になるかもしれません。

それから Drupal の機能の変更が必要な際は、フックを使って既存の機能をオーバーライドするのが基本です。コードを書き換えてしまうと、その時点でコアやモジュールのアップデートができなくなってしまうためです。

wataru.kato's picture

コメント有難う御座います。

上述のフォーラム質問を見て、Drupal6でもいろいろ検討していたんだなと知って試しているうちにDrupal7の以下:

http://api.drupal.org/api/drupal/includes!file.inc/function/drupal_basename/7

ここにたどり着きまして、basenameの関数をdrupal_basenameの独自関数に置き換えるアプローチが動いていることを知りました。
それで 7 を試すと既にコードに採用されていた、という感じです。

なので、上述リンクの情報はDrupal6以前での対処ですね。
ここではDrupal7以降の対処について、情報があれば伺いたいです。
本当に、あと一歩に見えますので。

あと機能変更はフックを使う件は、確かにそうですね。ご指摘ありがとうございます。
まだトライしたことがなかった(PHPコーダーじゃないのです;;;)ですが、勉強してみます。日本語の Drupal Pro Book と Drupal徹底入門 をざっと読んでいるのですが、まだその書き方の勘所(何から書くのか?など)が判っていません。

node/24625 は D7

dokumori's picture

node/24625 は D7 には関係なかったんですね。失礼しました。

api.drupal.org のdrupal_basename のページに行くと、先述した php のバグのページへのリンクがあり、そこにある 2011/4/11 のコメントを見ると、「ファイルネームに利用されているエンコーディングとロケールが一致しなければならない」と書いてあります。Ubuntu 10.04 で構築している私のローカルの環境では問題なく作動しているので、Windows2008R2 + XAMPP 1.7.4 という環境におけるエンコーディングの問題ではないかと考えます。

ご無沙汰しております、 jun784です。

jun784's picture

wataru.kato さん、こんにちは。

ご無沙汰しております、
jun784です。

私が推測するに、
データベースのエンコーディングがPHPのエンコーディングと一緒ではないのが問題かと思われます。

・PHPのエンコーディングの確認の手順

   phpinfo();

にて、 mb_encoding を検索

・DBのエンコーディングの確認の手順
phpmyadminのテーブルからエンコーディングを確認。(他にも方法はあります。)

以上の二つが一致していなければ、
PHPもしくはDBのエンコーディングを合わせてください。(PHPの設定の変更をお勧めします。)

理由
 Drupalはシステム上、
アップロードしたデータのファイルパスをデータベースに保存しますが、
データベースとPHPの文字エンコードが異なる場合、保存時、もしくは取得時にファイルパスのエンコーディングが書き変わってしまい、PHP上からパスを取得してもエンコーディング、

例)
 UTF-8のPHP上の処理でアップロードファイルの名称を変更 -> 日本語ファイル名のテスト.txt
 Shift_jisのデータベースからファイルのパスを取得 -> 譌・譛ャ隱槭ヵ繧。繧、繝ォ蜷阪・繝・せ繝・txt
 

ためしにこの状態から、直接ファイル名を元の日本語ファイル名にリネームしてやると、きちんとリンクをクリックするとダウンロードできるようになります。
しかし今度はDrupal7側の削除などの操作時に、元ファイルが見つからない、要するに紐付けが切れた状態になり失敗してしまいます。

とりあえず環境情報です

wataru.kato's picture

dokumori 様、 jun784 様

情報有難う御座います。

今確認したところ、私のテスト環境ではいままで、XAMPPのPHP設定はメモリや接続時間あたりしかデフォルト設定を変更していなさそうです。

1)phpinfoの情報

「mbstring」 の項目で、関係しそうなところをピックアップすると、

・mbstring.encoding_translation →Off
・mbstring.http_input →pass
・mbstring.http_output →pass
・mbstring.internal_encoding →no value
・mbstring.language →neutral
・mbstring.strict_detection →Off

こんな状態でした。
php.ini を見ると上記項目はたいていコメントアウト状態で、これがXAMPPのデフォルトのようです。

2)DB(MySQL)のエンコーディング

 →全て utf8_general_ci

です。
どこから変更してテストしようか、思案中です。

なんとなくですが、 1)の方をUTF-8の方に設定を振っても、
Windowsのファイル名がShift-JISなので、解決しない?
そうすると 1)、2)も共にShift-JISのほうに設定を合わせる方が近道でしょうか・・・

動かしているWebサーバが他のPHPのソフト(bbPressなど)と相乗りなので、
PHPの文字コードの設定変更は今まで躊躇してました。
それでも必要なら、対処しようと考えています。

(追記: 4/16 18:40)
内容的にDrupalから離れてPHPやWAMP環境の話になっていますが・・・
WindowsでDrupalを使おうとする際のFAQになるかと思いますので、すいませんがこのまま続けさせてください。

wataru.kato

jun784's picture

wataru.kato さん

お世話になっております、
jun784です。

PHPの設定に関してですが、
Drupalももちろんですが、
日本語や中国語などのマルチバイト文字のサイトを作る際には、
PHPとデータベースのエンコーディングに関してはかならず設定などを考えた上での構築が必要かと思われます。

なんとなくですが、 1)の方をUTF-8の方に設定を振っても、
Windowsのファイル名がShift-JISなので、解決しない?
そうすると 1)、2)も共にShift-JISのほうに設定を合わせる方が近道でしょうか・・・

そう思ってしまいますが、以外とそれは遠回りになると思います。
windowsのエクスプローラーでは普通の設定ではshift_jisの形式でファイル名を表示致しますが、
プログラムはUTF-8のファイルの中身はUTF-8で扱います。
あくまでエクスプローラーでみた場合にファイル名だけが文字化けしているという認識がよいと思います。

動かしているWebサーバが他のPHPのソフト(bbPressなど)と相乗りなので、
PHPの文字コードの設定変更は今まで躊躇してました。
それでも必要なら、対処しようと考えています。

PHPの設定はhtaccess, php.iniを設定すればフォルダー毎に可能です。

以下を参考にされてみてください。

http://wiki.ohgaki.net/index.php?PHP%2Ftips%2F%E6%97%A5%E6%9C%AC%E8%AA%9...
http://www.shigeweb.jp/php/project_p/?section=setup&page=htaccess

日本語ファイル名のアップロードについて

hodota's picture

こんにちは、ほどたです。

参考までに、

Drupal 7.17 で Plupload integration モジュールをインストールしたら、日本語ファイルのアップロードはできました。

http://drupal.org/project/plupload

では

kazu Hodota Gennai3 Corporation email: hodota@gennai3.co.jp

ファイル名のみが問題であれば

nobuyuki3's picture

サーバーにアップロードされたファイル名のみが問題であれば、これでファイル名はアルファベットになります。私のサイトでも日本語でアップロードする人が多いので、その対策にとりあえず入れています。

http://drupal.org/project/transliteration

日本語は、ひらがながローマ字かされ、漢字は中国語のピンインになってます。とりあえず、読めないけどアルファベットにして、多くのトラブル回避はできます。

ベストでないにせよ、一番簡単だと思います。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: