Windows環境でアップロードしたファイルの名前に日本語を含むとダウンロードできない
mamadou33 > Windows環境でアップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/21 10:46 |
---|
Windows Server 2008 R2 に BaserCMS をインストール、アップローダーも組み込みました。
ただ、ダウンロードで以下のような問題が解消できません。 ---------------------------------------------------------- ファイル名に日本語を含むファイルをアップロードし、 ブログなどの本文か詳細に「アップローダー」というメニューで アップロードファイルURLのリンクを載せ、新規登録を行いました。 ただ、登録したページを開き、リンクをクリックすると、 「Web ページが見つかりません」と表示されます。 \app\webroot\files\uploads フォルダ内をみると、 アップしたファイルの名前が文字化けしておりました。 ---------------------------------------------------------- 解決方法ございましたら、ご教授いただけないでしょうか? ○BaserCMSのバージョン:1.6.7.1 ○スマートURLの利用:OFF ○設置フォルダ:C:\basercms\bc01 ○利用しているデータベース: MySQL ○PHPスキル(自己評価):初心者 ○OSの種類:Windows Server 2008 R2(評価版) ○Apacheのバージョン:2.2 ○PHPのバージョン:5.2.16 ○データベース種類・バージョン:MySQL 5.5.8(x64) よろしくお願い致します。 |
non > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/21 14:00 |
---|
ファイル名をUTF-8で保存するようになっているみたいなので、Windowsで日本語ファイルの文字化けは仕方ないかもですね。
|
mamadou33 > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/22 11:43 |
---|
ソースを修正することにより、問題を解消しようと試みております。
uploader\controllers\uploader_files_controller.phpの 180〜181行目の間に ----------------------------------------------- $aaa = mb_convert_encoding($this->data['UploaderFile']['name']['name'], "SJIS", "UTF-8"); $this->data['UploaderFile']['name']['name'] = $aaa; ----------------------------------------------- を追加し、 uploader\models\uploader_file.phpの 88行目を ----------------------------------------------- return file_exists(mb_convert_encoding($savePath,"UTF-8","SJIS")); ----------------------------------------------- に変更したところ、 アップしたファイル名の文字化けは解消しましたが、 アップロードファイル一覧画面に表示される ファイル名の日本語部分が欠けて表示されてしまいました。 なにか問題解決方法ございましたら、よろしくお願い致します。 |
ryuring > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/22 13:14 |
---|
こんにちは。
SJISに変換をかけた状態でDBに保存しているので文字化けしているのだと思います。 ファイルの処理を行った後、DB保存直前にUTF-8に戻してあげる必要があります。 改修箇所を一つ一つお伝えするのは難しいので、取り急ぎ、ファイル保存の仕組みだけお伝えします。 ファイル保存は、CakePHPのBehaviorという仕組みを利用して、beforeSave をフックし、メソッドを割り込ませています。 /baser/models/behavior/upload.php この保存処理が終わった後に、DBへの保存が実行されますので、その前の段階で、UTF-8に戻してはどうでしょうか? 頑張ってください! Twitter:@ryuring |
mamadou33 > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/22 15:14 |
---|
ryuringさん
アドバイスいただきありがとうございます。 /baser/models/behavior/upload.phpの 175行目あたりに ---------------------------------------- $aaa = mb_convert_encoding($model->data[$model->name][$field['name']]['name'], "SJIS", "UTF-8"); $model->data[$model->name][$field['name']]['name'] = $aaa; ---------------------------------------- 231行目あたりに ---------------------------------------- $bbb = mb_convert_encoding($model->data[$model->name][$field['name']]['name'], "UTF-8", "SJIS"); $model->data[$model->name][$field['name']]['name'] =$bbb; ---------------------------------------- を追加して動作確認したところ、 こちらもアップファイル名は文字化けしておりません。 DBも参照しましたが、UTF8の文字コードで入っているようにみえます。 ただ、やはりアップロードファイル一覧画面で表示されている ファイル名については、日本語が欠けているままです。 あと、ファイル削除したときに正常終了しますが、 アップしたファイルが残った状態になります。 これに関しても削除するファイル名の文字変換が必要な気がしますが。。。 もう少しアドバイスいただけないでしょうか? よろしくお願いいたします。 |
mamadou33 > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/22 15:48 |
---|
>DBも参照しましたが、UTF8の文字コードで入っているようにみえます。
すみません。見誤っておりました。 pg_uploader_files.nameが消えているようです。。。 処理を見直して見ます。 |
mamadou33 > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/22 17:12 |
---|
処理を見直し
/baser/models/behavior/upload.php(function saveFile)の 306〜307行目の間に --------------------------------------------------- if(!$this->tmpId) { $fileName = $prefix . $basename . $suffix . '.'.$field['ext']; $aaa = mb_convert_encoding($fileName, "SJIS", "UTF-8"); … ★ $fileName = $aaa; … ★ }else { $fileName = $this->tmpId.'_'.$field['name'].'.'.$field['ext']; } --------------------------------------------------- 326〜327行目の間に --------------------------------------------------- } $bbb = mb_convert_encoding($fileName, "UTF-8", "SJIS"); … ★ $fileName =$bbb; … ★ $ret = $fileName; --------------------------------------------------- の間に追加したところ 画像ファイル(jpgなど)以外はファイル名が文字化けせずにアップロードされました。 アップロードファイル一覧画面も表示されました。 ただし、 ・削除するとファイルが残ったままになる ・記事にアップローダーで投稿し、リンクをクリックすると 「404 NOT FOUND エラーにリクエストされたアドレス '/files/uploads/.......' はこのサーバにありませんでした。」 と表示されます。 画像ファイルをアップした場合は、サムネイル画像に「×」が表示され、 アップフォルダには XXX_large, XXX_small というファイルが存在し XXX部分は文字化けしております。 ちょっと改修に難航しております。 なにか問題解消方法ございましたら、ご教授願います。 |
mamadou33 > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/24 19:49 |
---|
現在の修正箇所です。
------------------------------------------------ /baser/models/behavior/upload.php 306〜307行目の間で $fileName を UTF-8 ⇒ SJIS に変換 326〜327行目の間で $fileName を SJIS ⇒ UTF-8 に戻す 362〜363行目の間で $fileName を UTF-8 ⇒ SJIS に変換 371行目で return の前に $fileName を SJIS ⇒ UTF-8 に戻す 471〜472行目の間で $fileName を UTF-8 ⇒ SJIS に変換 483行目で return の前に $fileName を SJIS ⇒ UTF-8 に戻す /app/plugins/uploader/models/uploader_file.php 80行目で return の前に $fileName を UTF-8 ⇒ SJIS に戻す ------------------------------------------------ ドキュメントファイル、画像ファイル共に ファイル名が文字化けせずにアップロードできました。 削除も問題なく動作しました。 ただし、まだ以下の問題が解消されません。 ・記事にアップローダーで投稿し、リンクをクリックすると 「404 NOT FOUND エラーにリクエストされたアドレス '/files/uploads/.......' はこのサーバにありませんでした。」 と表示されます。 ・画像ファイルをアップした場合は、 アップロードファイル一覧画面や記事に投稿した場合、 サムネイル画像が「×」で表示される。 恐らくダウンロードのリンクやサムネイル画像パスのURLエンコードが必要だと思いますが、 修正箇所を割り出せていません。 なにか問題解消法ございましたら、ご教授願います。 |
ryuring > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2010/12/24 23:11 |
---|
こんばんは。
もしかしたら、保存時に、ビヘイビアに処理を引き渡す前に、コントローラー側でURLエンコードしてしまって、 そのままの状態でDBに保存した方が早いかもしれないですね。 Twitter:@ryuring |
mamadou33 > Re: アップロードしたファイルの名前に日本語を含むとダウンロードできない @ 2011/1/6 15:25 |
---|
修正の途中経過。
------------------------------------------------ /app/plugins/uploader/controllers/uploader_files_controller.php 184行目の urldecode($name) の値を SJIS ⇒ UTF-8 に変換 /app/plugins/uploader/models/uploader_file.php 80行目で return の前に $fileName を UTF-8 ⇒ SJIS に変換 /app/plugins/uploader/views/helpers/uploader.php 79行目で return の前に $resizeName を UTF-8 ⇒ SJIS に変換 /baser/models/behavior/upload.php 306〜307行目の間で $fileName を UTF-8 ⇒ SJIS に変換 326〜327行目の間で $fileName を SJIS ⇒ UTF-8 に戻す 362〜363行目の間で $fileName を UTF-8 ⇒ SJIS に変換 371行目で return の前に $fileName を SJIS ⇒ UTF-8 に戻す 471〜472行目の間で $fileName を UTF-8 ⇒ SJIS に変換 483行目で return の前に $fileName を SJIS ⇒ UTF-8 に戻す /baser/views/helpers/app_helper.php 149行目で $file を UTF-8 ⇒ SJIS に変換 ------------------------------------------------ URLエンコードは特に必要ありませんでした。 ファイルアップロード・ダウンロードについては ほぼ全ての機能が正常に動作することができました。 ただ一点だけ、 「ある特定の2バイトコードを含む名前のファイルの場合、 管理者メニュ一覧で 「編集」を選択すると、ファイル情報編集画面が固まる。 或いは "ダウンロード" リンクをクリックしてもファイルを取得できない」 という現象が起こっています。 #ある特定の2バイトコードとは PHPでSJISを使うと文字化けするコード。 "表"、"申"、"能" など。 デバックしていくと、 /app/plugins/uploader/controllers/uploader_files_controller.php 184行目の urldecode($name) の値に上記の文字を含むと findByNameメソッドの返却値 $file が空になっておりました。 上記について、問題解消法ございましたら、ご教授願います。 |