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']));

これで完了。
原因さえわかれば対処はそれほど難しいものでもありません。


しかし、まだ他にも不具合が出てきそうだな…。


abm55608 at 13:11│Comments(0)TrackBack(0) Linux 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔