以前、「Laravel5.6, 5.7 Voyager 画像を元ファイル名を維持してアップロード」という記事を書きましたが、今回はそちらの続きです。
というのも、この週末、画像アップロードを日本語ファイル名のものにも対応してほしい、と依頼を受けまして、どういうこっちゃと見てみたらアップロードした画像ファイルの名前が「.png.png」みたいになっていました。(元ファイル名は仮に「日本語.png」とかでアップロード。)
ファーーーーーwwwwwバグっとるやんけwwwwwということで、バグフィックスを行いましたので、そちらの方法を共有したいと思います。
編集するファイル
・/vendor/tcg/voyager/src/Http/Controllers/VoyagerController.php
・/vendor/tcg/voyager/src/Http/Controllers/VoyagerMediaController.php
・/vendor/tcg/voyager/src/Http/Controllers/ContentTypes/Image.php(オーバーライドできなそう、、、)
このうちImage.php以外はvendor外に外出しし、オーバーライド可能ですので、まずそちらからやってください→詳細はこちら
編集内容
基本的に、各ファイルにsetlocaleを追記して行くだけです。
・/vendor/tcg/voyager/src/Http/Controllers/VoyagerController.php
postsなど、TinyMCE(Rich Text Area)に画像をアップロードした時の処理関係です。
TinyMCEから画像をajaxで保存した時に、変な名前になるのを解消。
1 2 3 4 |
public function upload(Request $request) { setlocale(LC_ALL, 'ja_JP.UTF-8'); //setlocale追記 ..... |
・/vendor/tcg/voyager/src/Http/Controllers/VoyagerMediaController.php
メディア機能で日本語ファイルが表示されない問題を解消します。
1 2 3 4 5 |
private function getFiles($dir) { $files = []; setlocale(LC_ALL, 'ja_JP.UTF-8'); //setlocaleを追記 .... |
・/vendor/tcg/voyager/src/Http/Controllers/ContentTypes/Image.php
Breadのカラムタイプ「Image」から画像を保存した時に、変な名前になるのを解消。
1 2 3 4 5 6 |
protected function generateFileName($file, $path) { if (isset($this->options->preserveFileUploadName) && $this->options->preserveFileUploadName) { setlocale(LC_ALL, 'ja_JP.UTF-8'); //setlocale追記 $filename = basename($file->getClientOriginalName(), '.'.$file->getClientOriginalExtension()); $filename_counter = 1; |
これらの問題は、日本語ファイルをアップロードした時は、マルチバイト文字に対応していない関係で日本語をうまく読み込んでくれない所に原因があると推測しています。
アップロード系:basenameメソッドを通る時、日本語対応していないせいで拡張子をファイル名として認識する?
表示系:日本語対応していないので、ファイルが見つからない?
config/app.phpでset_localeをjaに変更したりもしてみたのですが、voyagerにはlang/ja系のファイルがないので、表記がやばいことになりました、、、多分うまくやればconfigから直ると思うんですけどね。
Vendor外に出せないImage.phpに関しては、編集内容も少ないのでしょうがないかな、と思うことにしました。
Voyagerも早く日本語対応してくれないかなー、、、
コメントを書く