ファイルダイアログとは
input
タグの type にfile
を指定し、クリックすると出てくるあれです。現状、ファイルダイアログ自体を直接プログラムから呼び出す方法は無いようで、
ファイルダイアログを呼び出す方法として、以下のような方法が解説されています。
- input タグを hidden にして、label をボタンのように見せる CSS ハック
- input タグを hidden にして、getElement で DOM を取得し、
click
を呼び出す
これらの方法は、同じファイルを複数回選択したときに、input のchange
イベントが発生しなかったり余計な要素のレンダリングが必要であったりします。
ファイルダイアログを呼び出して、ファイルを受け取りたいだけなのに、スマートではありません。
今回は、ファイルダイアログを簡単に呼び出し、ファイルを受け取る方法を解説します。
実装
ポイントとしては、ファイルダイアログを呼び出すだけなら、input 要素のレンダリングは必要ありません。
そのかわりに、createElement
で input 要素を作成しclick
で type=file の input タグをクリックしたときと、同じイベントを発生できます。
input 要素ではonchange
の発火後、input
のfiles
プロパティで、ファイルダイアログで選択されたファイルへアクセスできます。型としてはFileList
またはnull
を受け取るので、null チェックのために分岐します。
Promise でラップすることにより、onchange
を同期的に処理できるため、呼び出し側で await
を付ければ同期的に処理できます。サンプルでは、files
がnull
の場合は、reject
として処理しています。
また、引数としてaccept
とmultiple
を受け取るようにしています。どちらも input タグに存在する属性で、accept
には受け取るファイルの種類を指定します。multiple
をtrue
にすると複数のファイルを選択できます。
この関数をボタンなどのクリックイベント等によって呼び出すことで、ファイルダイアログを開き、ファイルを受け取ることができます。
ロジックとビューを分離でき、シンプルに実装できるため、ぜひ参考にしてください。
Edit this page on GitHub