laravel5.5で、音声ファイルだけファイルアップロード出来るようにしたい!
ポッドキャストみたいに、音声配信・共有がメインのWebサービスの場合、音声ファイルだけアップロード出来るように制限したい。
laravelのバリデーションでは、画像制限くらいしか無い
image=フィールドで指定されたファイルが画像(jpg、png、bmp、gif、svg)であることをバリデートします。
なので、MIMEで制限するのが良いかと思ったけど、音声フォーマットで大量にあるのね…。
MIMEタイプと対応する拡張子の完全なリストは、apacheの公式HPで確認できます。
mimesで制限しようかと思ったけど、mimetypesの方がaudio/*みたいにワイルドカードが使えて便利!
あとドコモ系スマホだと、video/3gppなんかを音声ファイルとして送ってくるので、それも追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// 第1引数 = $request(postデータ) // 第2引数 = バリデーション・ルール // 第3引数 = name.ruleの上書きの文字列 // 第4引数 = nameの上書きの文字列 $messages = [ 'upload_file.mimetypes' => $request->file('upload_file')->getClientOriginalName() .'はアップロードできません。', ]; $renames = [ // 'name' => '名前', ]; $this->validate($request, [ 'upload_file' => [ 'file' => 'max:51200', // 最大50MBまで(KB指定) // 音声ファイルのみ! 'mimetypes:audio/*,video/3gpp,video/3gpp2' ], ], $messages, $renames ); |
そもそもMIME(multipurpose Internet mail extensions)って何?って話だけど、大昔のメールは英数字テキストしか送れなかったが、2バイト文字や画像とかバイナリファイルも添付したい!というのでメールの仕様を拡張。
text/plain
image/png
みたいに、大分類/小分類みたいな構造になっていて、そのファイルの種類を教えてくれるためのものです。
laravelはブラウザから送ってきた物は使わずに、サーバ側でファイルからMIMEを導くので、MIME偽装にも対応できる。拡張子を変更しても正しく判定します。
ちなみに、バリデーション・メッセージを上書きしないと、以下のようにアップロード可能なMIMEを表示する(一般人には意味不明なメッセージ!)
アップロードファイルはaudio/*, video/3gpp, video/3gpp2タイプのファイルにしてください。