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

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

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

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

解決済

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

gobindar
gobindar

総合スコア51

Laravel 5

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

1回答

0リアクション

1クリップ

4029閲覧

投稿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

public function upload_template_confirm(Request $request) { $templatevalidation = new TemplateValidationRequest; $forvali = $templatevalidation->templatecategoryvali(); $requestdata = $request->all(); $forvali['inputs'] = $requestdata; //validation $validation = \Validator::make($forvali['inputs'],$forvali['rules'],$forvali['messages']); //if fails if($validation->fails()) { return redirect()->back()->withErrors($validation->errors())->withInput(); } ・・・・・

バリデーション

php

public function templatecategoryvali(){ //rules $rules = [ 'template_title' => 'required | max:50', 'filedata' => 'required|max:8192|mimes:xlsx,xls,doc,docx,ppt,pptx,pdf', 'template_comment' => 'max:1000', ]; $messages = [ 'filedata.mimes' => 'xlsx, xls, doc, docx, ppt, pptx, pdf形式のファイルを指定して下さい。', 'filedata.max' => 'ファイルには、8MB以下のファイルを指定して下さい。' ]; $result['rules'] = $rules; $result['messages'] = $messages; return($result); }

リクエストの内容

php

エラーが出ないファイル +files: FileBag {#47 ▼ #parameters: array:1 [▼ "filedata" => UploadedFile {#32 ▼ -test: false -originalName: "4_ステップ1.pptx" -mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation" -size: 146372 -error: 0 path: "/Applications/MAMP/tmp/php" filename: "phppiirtx" basename: "phppiirtx" pathname: "/Applications/MAMP/tmp/php/phppiirtx" extension: "" realPath: "/Applications/MAMP/tmp/php/phppiirtx" aTime: 2019-04-28 14:18:20 mTime: 2019-04-28 14:18:20 cTime: 2019-04-28 14:18:20 inode: 45050848 size: 146372 perms: 0100600 owner: 501 group: 80 type: "file" writable: true readable: true executable: false file: true dir: false link: false } ] } エラーの出るファイル +files: FileBag {#47 ▼ #parameters: array:1 [▼ "filedata" => UploadedFile {#32 ▼ -test: false -originalName: "18_スケジュール3.pptx" -mimeType: "application/vnd.openxmlformats-officedocument.presentationml.presentation" -size: 350585 -error: 0 path: "/Applications/MAMP/tmp/php" filename: "phpQ8o7pr" basename: "phpQ8o7pr" pathname: "/Applications/MAMP/tmp/php/phpQ8o7pr" extension: "" realPath: "/Applications/MAMP/tmp/php/phpQ8o7pr" aTime: 2019-04-28 14:16:19 mTime: 2019-04-28 14:16:19 cTime: 2019-04-28 14:16:19 inode: 45050497 size: 350585 perms: 0100600 owner: 501 group: 80 type: "file" writable: true readable: true executable: false file: true dir: false link: false } ] }

考えたこと

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

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

宜しくお願い致します。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Laravel 5

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