inputのtype=file選択時にjsでバリデーションする【vue.js】

inputのtype=file選択時にjsでバリデーションする【vue.js】 技術メモ

本ページはアフィリエイトプログラムを利用しています

input要素のtype=fileでのファイルアップロード。
頻繁に使うわけですが。

通常だと、submitされた値をPHPだと$_FILESなんかで受け取って、ファイルサイズや拡張子なんかのバリデーションをしたり、問題無ければファイルアップロードしたりします。
が、submit前、クライアント側でユーザがファイル選択をした段階でバリデーションをしたいってこともあります。ということで、それをjavascriptで書いてみます。

これまで何度か書いているのですが、都度忘れてしまうので備忘録として。
今回はvue.jsを使って書いていますが、他のフレームワーク・ライブラリでも同様に使えるはずです。

フォームsubmit前にinputのtype=fileのバリデーションをしたい

inputのtype=fileの値のバリデーションは、前述の通りサーバサイド側で行うことが多いと思います。

今回の件では、POSTされる要素のバリデーションをsubmit前に全てJavascriptでおこなっていました。
後からtype=fileが追加されたので、そのバリデーションもファイル選択時におこなってしまおうというのが趣旨です。

vue.jsでtype=fileのファイル選択時にバリデーションをおこなう方法

まず、HTMLを下記のように書いたとします。

<ul>
  <li><input type="file" name="upload_photos_pdfs[]"></li>
  <li><input type="file" name="upload_photos_pdfs[]"></li>
  <li><input type="file" name="upload_photos_pdfs[]"></li>
  <li><input type="file" name="upload_photos_pdfs[]"></li>
  <li><input type="file" name="upload_photos_pdfs[]"></li>
</ul>
inputのtype=file選択時にjsでバリデーションする【vue.js】

最終的には複数ファイルのアップロード。
このHTMLに、ファイル選択時に発生するイベントを取得するため、input要素にonchangeを追加します。

<input type="file" name="upload_photos_pdfs[]" @change="validate_uploads">

vue.jsだとv-on:change(@change)ですね。
これでファイル選択時に、メソッドのvalidate_uploadsが着火されます。

あとは、vue.js側のメソッドにvalidate_uploadsを書き加えます。

methods: {
  validate_uploads: function (event) {
    let file = event.target.files[0],
        name = file.name,
        size = file.size,
        type = file.type,
        errors = ''

    //上限サイズは3MB
    if (size > 3000000) {
      errors += 'ファイルの上限サイズ3MBを超えています\n'
    }

    //拡張子は .jpg .gif .png . pdf のみ許可
    if (type != 'image/jpeg' && type != 'image/gif' && type != 'image/png' && type != 'application/pdf') {
      errors += '.jpg、.gif、.png、.pdfのいずれかのファイルのみ許可されています\n'
    }

    if (errors) {
      //errorsが存在する場合は内容をalert
      alert(errors)
      //valueを空にしてリセットする
      event.currentTarget.value = ''
    }
  }
}

関数側(validate_uploads)では発生したイベントから、選択されたファイルのファイル名・ファイルサイズ・メディアタイプなどが取得できます。
取得した値から、ファイルの上限サイズ・制限拡張子などのバリデーションをおこなえます。

選択されたファイルがバリデーションに引っかかった場合はアラートを表示し、type=fileの値を空にしてリセットします。

inputのtype=file選択時にjsでバリデーションする【vue.js】

ファイルサイズ上限を超えたファイルを選択された時。

inputのtype=file選択時にjsでバリデーションする【vue.js】

許可していない拡張子のファイルが選択された時。

inputのtype=file選択時にjsでバリデーションする【vue.js】

どちらも引っかかった場合。
バリデーションの内容やアラート文は状況に合わせて変更する形で。

コメント

タイトルとURLをコピーしました

Fatal error: Uncaught Error: Call to undefined function wp_parse_auth_cookie() in /home/c8315293/public_html/taupe.site/wp-includes/user.php:3632 Stack trace: #0 /home/c8315293/public_html/taupe.site/wp-content/plugins/microsoft-clarity/clarity-server-analytics.php(105): wp_get_session_token() #1 /home/c8315293/public_html/taupe.site/wp-content/plugins/microsoft-clarity/clarity-server-analytics.php(35): clarity_construct_collect_event() #2 /home/c8315293/public_html/taupe.site/wp-includes/class-wp-hook.php(341): clarity_collect_event() #3 /home/c8315293/public_html/taupe.site/wp-includes/class-wp-hook.php(365): WP_Hook->apply_filters() #4 /home/c8315293/public_html/taupe.site/wp-includes/plugin.php(522): WP_Hook->do_action() #5 /home/c8315293/public_html/taupe.site/wp-includes/load.php(1308): do_action() #6 [internal function]: shutdown_action_hook() #7 {main} thrown in /home/c8315293/public_html/taupe.site/wp-includes/user.php on line 3632