▲TOPへ戻る

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

upload

やりたいこと

以下のように、ドラッグ&ドロップ、 またはクリックしファイルを選択し、 画像をウェブ上にアップロードする方法を紹介します。

クリックして画像を選択し、アップロード

HTML

2行目 : typefileを、acceptimage/*と記述。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);

参考

js
【javascript】子要素をクリックした時に親要素へ影響させないstopPropagation()
  1. クリックして選択

    e.target.files[0]でドロップしたファイルを取得

    URL.createObjectURL(e.target.files[0])をimgタグのsrcに指定

  2. ドラッグ&ドロップ

    e.dataTransfer.filesでドロップしたファイルを取得

    URL.createObjectURL(e.dataTransfer.files)をimgタグのsrcに指定

こんな記事も読まれています。

profile

パソコン好きなガオ

コロナ禍によるステイホームを機にプログラミングを学ぶ。パソコンに関してはプロではないが、ちょっと詳しい程度。

パソコン

javascript

カメラ

ブログ