お世話になっております。
当方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
のうちどれかに一致するもの、
とするのも一つの手かと考えました。
しかし、ファイルのタイプを厳密に見ず、
名称のみで判断するやり方は危険性がある
(全く根拠はなく、なんとなくですが)
のではないかと思い、一旦その対応はとっておりません。
もし上記やり方でも問題なければ、
バリデーションは使用せず、拡張子を
文字列で判定する記述を入れようと思います。
宜しくお願い致します。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/29 01:35
退会済みユーザー
2019/04/29 02:49