質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

5400閲覧

Laravel5のバリデーションでOfficeファイルのmimesタイプチェックが正しくできない

gobindar

総合スコア51

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/04/28 05:20

編集2019/04/28 05:22

お世話になっております。
当方Laravel5.5にてファイルアップロード機能を有する
WebSiteを構築しております。
環境はmac OS Mojave10.14.2
ブラウザはGoogle Chrome バージョン: 71.0.3578.98になります。

やりたいこと

拡張子がxlsx,xls,doc,docx,ppt,pptx,pdfのファイルのみをアップロード可能とするため、
バリデーションチェックをかけたいです。

現状

パワーポイントファイルをアップロードすると、
あるファイルはmimeのバリデーションにはひっかからず、
あるファイルはmimeのバリデーションにはひっかかってしまいます。
尚、2つのファイルには下記の要素において違いがなく、
なぜ片方のみがバリデーションにかかるのかが全くわかりません。

<エラーの出るファイルと出ないファイルにおいて、同じであるということを確認した要素>
・-mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
(requestの"filedata"で確認)
・拡張子(ファイル名の末尾)
・作成したOfficeのバージョン

また、(余計な記号が入っていないかなどもチェックするため)
エラーが出るファイル・でないファイルそれぞれ、
ファイル名称を変更しても事象は変わりませんでした。

現状

・ファイル名
エラーが出ないファイル:4_ステップ1.pptx
エラーが出るファイル:18_スケジュール3.pptx

確認画面(アップロード画面の次)のコントローラー

php

1 public function upload_template_confirm(Request $request) 2 { 3 $templatevalidation = new TemplateValidationRequest; 4 $forvali = $templatevalidation->templatecategoryvali(); 5 $requestdata = $request->all(); 6 $forvali['inputs'] = $requestdata; 7 8 //validation 9 $validation = \Validator::make($forvali['inputs'],$forvali['rules'],$forvali['messages']); 10 11 //if fails 12 if($validation->fails()) 13 { 14 return redirect()->back()->withErrors($validation->errors())->withInput(); 15 } 16 17・・・・・ 18

バリデーション

php

1 public function templatecategoryvali(){ 2 3 //rules 4 $rules = [ 5 'template_title' => 'required | max:50', 6 'filedata' => 'required|max:8192|mimes:xlsx,xls,doc,docx,ppt,pptx,pdf', 7 'template_comment' => 'max:1000', 8 ]; 9 10 $messages = [ 11 'filedata.mimes' => 'xlsx, xls, doc, docx, ppt, pptx, pdf形式のファイルを指定して下さい。', 12 'filedata.max' => 'ファイルには、8MB以下のファイルを指定して下さい。' 13 ]; 14 15 $result['rules'] = $rules; 16 $result['messages'] = $messages; 17 18 return($result); 19 } 20

リクエストの内容

php

1エラーが出ないファイル 2 +files: FileBag {#47 ▼ 3 #parameters: array:1 [▼ 4 "filedata" => UploadedFile {#32 ▼ 5 -test: false 6 -originalName: "4_ステップ1.pptx" 7 -mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation" 8 -size: 146372 9 -error: 0 10 path: "/Applications/MAMP/tmp/php" 11 filename: "phppiirtx" 12 basename: "phppiirtx" 13 pathname: "/Applications/MAMP/tmp/php/phppiirtx" 14 extension: "" 15 realPath: "/Applications/MAMP/tmp/php/phppiirtx" 16 aTime: 2019-04-28 14:18:20 17 mTime: 2019-04-28 14:18:20 18 cTime: 2019-04-28 14:18:20 19 inode: 45050848 20 size: 146372 21 perms: 0100600 22 owner: 501 23 group: 80 24 type: "file" 25 writable: true 26 readable: true 27 executable: false 28 file: true 29 dir: false 30 link: false 31 } 32 ] 33 } 34 35 36エラーの出るファイル 37 +files: FileBag {#47 ▼ 38 #parameters: array:1 [▼ 39 "filedata" => UploadedFile {#32 ▼ 40 -test: false 41 -originalName: "18_スケジュール3.pptx" 42 -mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation" 43 -size: 350585 44 -error: 0 45 path: "/Applications/MAMP/tmp/php" 46 filename: "phpQ8o7pr" 47 basename: "phpQ8o7pr" 48 pathname: "/Applications/MAMP/tmp/php/phpQ8o7pr" 49 extension: "" 50 realPath: "/Applications/MAMP/tmp/php/phpQ8o7pr" 51 aTime: 2019-04-28 14:16:19 52 mTime: 2019-04-28 14:16:19 53 cTime: 2019-04-28 14:16:19 54 inode: 45050497 55 size: 350585 56 perms: 0100600 57 owner: 501 58 group: 80 59 type: "file" 60 writable: true 61 readable: true 62 executable: false 63 file: true 64 dir: false 65 link: false 66 } 67 ] 68 } 69

考えたこと

laravel標準のmimeバリデーションはやめ、
ファイル名の末尾から拡張子を判断し、
xlsx,xls,doc,docx,ppt,pptx,pdf
のうちどれかに一致するもの、
とするのも一つの手かと考えました。

しかし、ファイルのタイプを厳密に見ず、
名称のみで判断するやり方は危険性がある
(全く根拠はなく、なんとなくですが)
のではないかと思い、一旦その対応はとっておりません。
もし上記やり方でも問題なければ、
バリデーションは使用せず、拡張子を
文字列で判定する記述を入れようと思います。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

php

1$filename = request()->file('filedata'); 2$finfo = finfo_open(FILEINFO_MIME_TYPE); 3dd(finfo_file($finfo, $filename)); 4finfo_close($finfo);

このコードをバリデーションの前に書いて、mime_type が正しく判定されているかを確認してみてください。

https://yuzuemon.hatenablog.com/entry/2014/09/24/025159

投稿2019/04/28 12:18

編集2019/04/28 12:24
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gobindar

2019/04/29 01:35

Kosuke_Shibuya様 ご回答、ありがとうございます。 ご教示のコードで、 エラーが出るファイルはzipになっており、でないファイルは正しくmime_typeが判定 されていることがわかりました。 下記記事のように、zipを展開して判定する方法もあるようですが、 なかなか処理が煩雑になりそうです。 https://colo-ri.jp/develop/2011/09/office2007mime-type.html 質問文の「考えたこと」に記載のように、 ファイルの名称の末尾「.」以降を拡張子として、 文字列で判定するのは宜しくないでしょうか・・・?
退会済みユーザー

退会済みユーザー

2019/04/29 02:49

よろしくないですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問