2009年02月04日
ファイルアップロードの文字化け
先日Webグループウエア「La!cooda WIZ」のUTF-8化を行ないました。数日間使用する中では特に不具合は無い様子です。
しかし普段使用していない機能もいくつかあり、何気に動作テストを行なっていたところ、不具合発見です。
このソフト、ファイル共有というかライブラリ登録のような機能があります。この機能でアップロードしたファイル名に不具合発生です。
例えば「ほげほげ.jpg」というファイルをアップロードすると「.jpg」と表示されてしまいます。ただファイルの使用自体には問題ない様子。
しかし「ほげほげ.jpg」も「はにはに.jpg」もみんな「.jpg」と表示されますから、使い物になりません。
折しも文字コードに関する改造を行なった直後の、日本語に関する不具合。改造が原因だと思うじゃ無いですか。
さあ原因追及です。ソースコードのファイル名処理に関するところを追いながら、文字変数の変化を観察します。しかし特におかしなコードは見あたりません。
そのうち意外なところで不思議な動きを発見しました。それはphp関数「basename」。
パスのついたファイルからファイル名を抜き出す関数ですが、どうも日本語の処理がうまくいってないようなのです。
もしやと思い調べてみると、ありました。
http://bugs.php.net/bug.php?id=37738
要はphp5のバグです。
実はこのソフト、元々php4で作られていて、単純にphp5に乗せただけではまともに動きません。
使い始めた頃のサーバがphp4だったため特に問題はなかったんですが、少し前サーバにphp5を採用し、ソフトを対応させて使用していました。
つまりサーバを代えて以来ずっと不具合はあったが、あまり使わない機能なので気づかなかっただけだったんです。
ただこの機能は今後使用する予定ですので、修正することにします。
問題の箇所は、ファイル「record.php」の1282行目
$userfile_name2 = basename($_FILES['userfile']['name']);
これを日本語対応のsplit関数を使って代用します。
$userfile_name2 = end(mb_split("/",$_FILES['userfile']['name']));
これで完了。
原因さえわかれば対処はそれほど難しいものでもありません。
しかし、まだ他にも不具合が出てきそうだな…。
しかし普段使用していない機能もいくつかあり、何気に動作テストを行なっていたところ、不具合発見です。
このソフト、ファイル共有というかライブラリ登録のような機能があります。この機能でアップロードしたファイル名に不具合発生です。
例えば「ほげほげ.jpg」というファイルをアップロードすると「.jpg」と表示されてしまいます。ただファイルの使用自体には問題ない様子。
しかし「ほげほげ.jpg」も「はにはに.jpg」もみんな「.jpg」と表示されますから、使い物になりません。
折しも文字コードに関する改造を行なった直後の、日本語に関する不具合。改造が原因だと思うじゃ無いですか。
さあ原因追及です。ソースコードのファイル名処理に関するところを追いながら、文字変数の変化を観察します。しかし特におかしなコードは見あたりません。
そのうち意外なところで不思議な動きを発見しました。それはphp関数「basename」。
パスのついたファイルからファイル名を抜き出す関数ですが、どうも日本語の処理がうまくいってないようなのです。
もしやと思い調べてみると、ありました。
http://bugs.php.net/bug.php?id=37738
要はphp5のバグです。
実はこのソフト、元々php4で作られていて、単純にphp5に乗せただけではまともに動きません。
使い始めた頃のサーバがphp4だったため特に問題はなかったんですが、少し前サーバにphp5を採用し、ソフトを対応させて使用していました。
つまりサーバを代えて以来ずっと不具合はあったが、あまり使わない機能なので気づかなかっただけだったんです。
ただこの機能は今後使用する予定ですので、修正することにします。
問題の箇所は、ファイル「record.php」の1282行目
$userfile_name2 = basename($_FILES['userfile']['name']);
これを日本語対応のsplit関数を使って代用します。
$userfile_name2 = end(mb_split("/",$_FILES['userfile']['name']));
これで完了。
原因さえわかれば対処はそれほど難しいものでもありません。
しかし、まだ他にも不具合が出てきそうだな…。