inputをクリック、またはドラッグ&ドロップで、画像を選択し、ウェブページにアップロードさせる方法

やりたいこと
以下のように、ドラッグ&ドロップ、 またはクリックしファイルを選択し、 画像をウェブ上にアップロードする方法を紹介します。
クリックして画像を選択し、アップロード
HTML
2行目 : type はfileを、accept はimage/*と記述。hidden で非表示。
<div class="upload-box">
<!-- typeはfileを指定 -->
<!-- accept はimage/*を指定 -->
<!-- hiddenで非表示 -->
<input type="file" accept="image/*" id="input" hidden/>
<span>画像をドラッグ&ドロップ、または<br>クリックしてアップロードしてください!</span>
</div>
<div class="preview-box">
<img class="previewImg" src="" alt="" hidden /> <!-- アップロードされた画像が表示される -->
</div>
inputにhiddenを指定しないと以下のように表示されます。
CSS
参考までに
.upload-box,
.preview-box {
width: 350px;
min-height: 150px;
margin: 20px auto;
padding: 5px;
border: 2px dashed #333;
border-radius: 8px;
}
.upload-box {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
margin-bottom: 80px;
cursor: pointer;
}
.upload-box span {
text-align: center;
}
.preview-box img { /* preview-box内に画像を収める */
width: 100%;
object-fit: cover;
}
javascript
6行目 : inputのvalueを取得
7行目 : 何も選択されなければreturn
9行目 : fileのurlをsrcに指定
13行目 : inputのvalueが変更された時の処理
15行目 : uploadBoxをクリックすると、inputがクリックされたことになる
const uploadBox = document.querySelector(".upload-box");
const previewBox = document.querySelector(".preview-box img");
const fileInput = document.getElementById("input");
function roadImg(e) {
const file = e.target.files[0]; // inputのvalueを取得
if (!file) return; // 何も選択されなければreturn
previewBox.removeAttribute("hidden");
previewBox.src = URL.createObjectURL(file); // fileのurlをsrcに指定
}
// inputのvalueが変更された時の処理
fileInput.addEventListener("change", roadImg, false);
// uploadBoxをクリックすると、inputがクリックされたことになる
uploadBox.addEventListener("click", () => fileInput.click());
ドロップ&ドロップでファイルをアップロード
javascript
1行目 : ドラッグした時に背景色を変える
7行目 : ドラッグがエリアから離れたら背景色を元に戻す
17行目 : 背景色を白に戻す
18行目 : ドロップしたファイルを取得
21行目 : inputのvalueをドロップしたファイルに置き換える
23行目 : fileのurlをsrcに指定
26行目 : ファイルがドロップされた時の処理
28行目 : ドラッグした時の処理
30行目 : ドラッグがエリアから離れた時の処理
function dragover(e){ // ドラッグした時に背景色を変える
e.stopPropagation();
e.preventDefault();
this.style.background = "#e1e7f0";
}
function dragleave(e){ // ドラッグがエリアから離れたら背景色を元に戻す
e.stopPropagation();
e.preventDefault();
this.style.background = "#fff";
}
function dropLoad(e) {
e.stopPropagation();
e.preventDefault();
uploadBox.style.background = "#fff"; //背景色を白に戻す
let files = e.dataTransfer.files; //ドロップしたファイルを取得
if (files.length > 1)
return alert("アップロードできるファイルは1つだけです。");
fileInput.files = files; // inputのvalueをドロップしたファイルに置き換える
previewBox.removeAttribute("hidden");
previewBox.src = URL.createObjectURL(fileInput.files[0]); // fileのurlをsrcに指定
}
// ファイルがドロップされた時の処理
uploadBox.addEventListener("drop", dropLoad, false);
// ドラッグした時の処理
uploadBox.addEventListener("dragover", dragover, false);
// ドラッグがエリアから離れた時の処理
uploadBox.addEventListener("dragleave", dragleave, false);
参考

-
クリックして選択
e.target.files[0]でドロップしたファイルを取得
URL.createObjectURL(e.target.files[0])をimgタグのsrcに指定
-
ドラッグ&ドロップ
e.dataTransfer.filesでドロップしたファイルを取得
URL.createObjectURL(e.dataTransfer.files)をimgタグのsrcに指定
こんな記事も読まれています。
-
【HTML】【CSS】【javascript】電卓の作り方
電卓のソースコードを2つ紹介します。javascriptはわずか数行で書けます。
-
【JacvaScript】【CSS】たった4行のJavaScriptでできるハンバーガーメニューの作り方
たった4行のJavaScriptで作るハンバーガーメニューの作り方について紹介します。✖をつくるには、transform-originがポイントです。
- リンク
-
波紋エフェクトを表現するjqueryのripples-min.jsの使い方
jqueryのripples-min.jsを使うと簡単に水面の波紋を表現できます。波紋の広がりの速度、波紋の大きさ、波紋のブレの値を変えていろいろ表現させると面白いです。
-
【Javascript】querySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法。
JavascriptのquerySelectorAllで要素を取得し、クリックしたら、クラスを追加したり、削除したりする方法について解説します。querySelectorと同じように書いてしまうとエラーがでます。forEachを使うとすべてに適用できます。
- リンク
-
要素の高さを取得する方法。getBoundingClientRectとは?window.innerHeightとは?window.pageYOffsetとは?
要素の高さを取得する方法について解説します。getBoundingClientRect、window.innerHeight、window.pageYOffsetについて理解し、要素がいつ画面に現れるかを把握できるようにしましょう。
-
Javascriptを使ったページネーションの実装
トップページの記事が増えてきたので、何とかページネーションで最新の記事だけを表示できないかと思っていたら、いい記事を発見しました。カスタマイズして実装することができました。
- リンク
-
【Javascript】マウスの指す(X, Y)座標とドラッグ & ドロップを理解する
マウスの指す(X, Y)座標とドラッグ & ドロップについて解説します。mousedown, mouseover, mousemove, mouseupを使います。
-
【javascript】連想配列をテーブルできれいに表示する方法
javascript(Object.entries)を使って、連想配列の中身をテーブルできれいに表示する方法について紹介します。
- リンク