(1) 現象
半角英数名のファイルのアップロードはまったく問題ありませんが、
日本語名が混じると、ファイル名が消え、拡張子だけが残ります。
「.gif」や、「.jpg」という状態です。
この不自然なファイル名が取得されるため、更新が反映されないなどの
問題を引き起こします。
(2) 原因
PHP5の関数「basename」のバグです。
PHP6で解決されるということで、現在バグが放置状態、非推奨となっているようです。
アップロード処理で使用しているjQueryのプラグイン「jQuery File Upload 」に
この関数が潜んでおり、結果として、日本語名のファイル名が消えてしまう、
という現象を引き起こしていることが分かりました。
(3) 解決策
バグのある関数「basename」に代わる処理を作ることで対処できました。
// 対応前 $filename = basename($_FILES['upload_hoge']['name']); // 対応後 $filename = end(explode("/", $_FILES['upload_hoge']['name']));
(4) 懸念事項
海外製のソフトでは同様の問題があります
WordPressのプラグイン「ContactForm」や、CMSの「Drupal」でも
同様の現象が起きるようです。
「basename」関数については、日本語特有の問題のため、
プラグインの自動アップデートなどでは直らない可能性があり、要注意です。
コメント