目次
ドラッグ&ドロップでのファイル選択と画像プレビュー方法
フォームからアップロードするファイルを、画面外からのドラッグ&ドロップで選択可能にする方法と
ドラッグ&ドロップした画像ファイルをプレビューする方法を順番にメモします。
環境:
Mac OS 10.13.6、
ブラウザ : Google Chrome : 79.0.3945.88(Official Build) (64 ビット)
ドラッグ&ドロップしたファイルを選択状態にする
ブラウザへのドラッグ&ドロップ操作時に発生するイベント(DragEvent)の、
dropイベントを利用してinputタグへの選択を可能にします。
DragEventと発生タイミング
dragenter : 有効なドロップ先へドラッグ操作が開始したとき
dragover : 有効なドロップ先の上にドラッグされている間
dragleave : 有効なドロップ先からドラッグ操作が離れたとき
drop : 有効なドロップ先へドロップされたとき
(詳細)DragEvent
(HTML)
<form action="(送信先)" enctype="multipart/form-data" method="post"> <input type="file" name="upfile"> </form> <div id="preview-area">drop Here</div>
(CSS)
#preview-area {
width: 200px;
height: 200px;
border: 1px dotted;
object-fit: cover;
background-color: #fff;
}
inputタグ、type属性をfileとしてファイルを選択出来るようにし、
ファイルをドラッグ&ドロップする領域を作成します。(div#preview-area )
(JavaScript)
document.addEventListener('dragover',function(e){
e.preventDefault();
});
document.addEventListener('drop',function(e){
e.preventDefault();
});
var target = document.getElementById('preview-area');
target.addEventListener('drop', function (e) {
document.querySelector("[name='upfile']").files =
e.dataTransfer.files;
});
対象の領域以外でドラッグ&ドロップした際にファイルがブラウザ上で開かないよう、
document要素のdragoverとdorpイベントでpreventDefault関数を実行させる。
(イベント処理無効化)
対象の領域のdropイベントで、
ファイルを選択するinputタグのfilesプロパティへ※DataTransferオブジェクトのfilesの値を指定する事で、
通常のファイル選択と同じ動きとなる。
※ドラッグ&ドロップ操作の実行中、データを保持するために使われるHTML5の機能
ドラッグ&ドロップした画像をプレビューする
ドラッグ&ドロップで選択した画像ファイルを画面上にプレビュー出来るようにします。
今回はドラッグ&ドロップする場所とプレビューされる場所を同じ領域にしています。
(imgタグで作成した枠内へドラッグ&ドロップ)
(HTML)
<form action="(送信先)" enctype="multipart/form-data" method="post"> <input type="file" name="upfile"> </form> <img id="preview-area">
(CSS)
#preview-area {
width: 200px;
height: 200px;
border: 1px dotted;
object-fit: cover;
background-color: #fff;
}
(JavaScript)
document.addEventListener('dragover',function(e){
e.preventDefault();
});
document.addEventListener('drop',function(e){
e.preventDefault();
});
var target = document.getElementById('preview-area');
target.addEventListener('drop', function (e) {
document.querySelector("[name='upfile']").files =
e.dataTransfer.files;
//以降追加分
var reader = new FileReader();
reader.onload = function (e) {
target.src = e.target.result;
}
reader.readAsDataURL(e.dataTransfer.files[0]);
});
dropイベント内で、FileReaderオブジェクトを使用する。
プレビュー用のimgタグのsrc属性に選択中のバイナリデータ(画像)を指定し、
readAsDataURLで読み込ませる事でプレビューが可能となります。
jQueryで記述する
(jQuery : 3.3.1)
jQueryを使用する場合、以下のように記述出来ます。
(注意)
jQueryはJavaScriptのイベントオブジェクトdataTransferに直接アクセス出来ませんので、
originalEvent.dataTransferと記述します。
$(document).on("dragover drop", function(e){
e.preventDefault();
});
var target = $("#preview-area");
target.on("drop", function(e){
$("[name='upfile']").prop('files', e.originalEvent.dataTransfer.files);
var reader = new FileReader();
reader.onload = function (e) {
target.attr('src', e.target.result);
}
reader.readAsDataURL(e.originalEvent.dataTransfer.files[0]);
});
参考:
MDN web docs / DragEvent
MDN web docs / Event.target
MDN web docs / DataTransfer
MDN web docs / FileReader.readAsDataURL()
ドラッグ&ドロップでファイルをアップロードする(最低限版)
jQuery Event から DOM Event を取る
