(Sample)

今回は「ドラッグ&ドロップでファイルをアップロードし、画像プレビューまで表示するWebアプリ」の作り方を解説していきます!

フォームに「画像を選んでアップロード」するのはよくあるパターンですが、ドラッグ&ドロップ対応&即時プレビュー表示ができると、ユーザーの体験がグッと向上します。

はじめてJavaScriptを触る新人エンジニアの方にもわかるように、しっかり解説しますね!


全体の構成と仕組み

この機能は次の3つで構成されています:

  1. HTML:ページの土台(表示部分)
  2. CSS:見た目の調整
  3. JavaScript:動作の制御(ファイル処理・アップロードなど)

HTMLの役割:基本構造をつくる

ポイントとなる要素

<div class="dropzone">
  ここに画像ファイルをドラッグ&ドロップしてください
</div>
<input type="file" class="file-input" multiple style="display: none" />
<div class="file-list mt-3"></div>
<div class="preview"></div>

要素説明
.dropzoneファイルのドラッグ&ドロップ対象エリア。クリックにも対応。
.file-inputファイル選択ダイアログ(実際には非表示)
.file-listアップロードするファイルの情報を表示
.preview画像のサムネイルを表示する領域

フォームがなくても JavaScript で直接ファイルを取得して、画面に表示&アップロードできる仕組みになっています。


CSSのポイント:見た目で操作性を上げる

.dropzone {
  border: 2px dashed #007bff;
  background: #f8f9fa;
  text-align: center;
  cursor: pointer;
}
.dropzone.dragover {
  background: #e2e6ea;
}
.preview img {
  max-width: 100px;
}

専門用語解説

  • dashed:点線のボーダー。ドラッグ&ドロップエリアを視覚的に表現。
  • .dragover:ファイルを上に持ってきたときのスタイル変更(ハイライト表示)。
  • max-width:画像がはみ出さないように縮小。

例えると、dropzoneは「仮想の箱」。ファイルをこの箱に「放り込む」ような操作です!


JavaScriptの役割:ファイルを受け取り、表示・アップロード!

主な処理の流れ

dropzone.addEventListener("drop", (event) => {
  event.preventDefault();
  const files = event.dataTransfer.files;
  handleFiles(files);
});

function handleFiles(files) {
  preview.innerHTML = "";
  for (const file of files) {
    if (file.type.startsWith("image/")) {
      const img = document.createElement("img");
      img.src = URL.createObjectURL(file);
      preview.appendChild(img);
    }
    formData.append("files", file);
  }
  uploadFiles(formData);
}




注目のJavaScript機能解説

機能・API役割
dragover, dropドラッグ&ドロップを検知し、ファイルを取得
event.dataTransferドロップされたファイルの情報を取得する
URL.createObjectURL()ブラウザ上で一時的に画像URLを作成し、即座に表示できるようにする
fetch("/upload")サーバーへファイルを送信(POSTリクエスト)
FormData複数のファイルをひとまとめにして送信するためのオブジェクト

イメージで流れを理解しよう

ユーザーが画像をドラッグ → .dropzone にドロップ
    ↓
JavaScriptがファイル情報を取得
    ↓
即座にサムネイル表示(preview)
    ↓
fetchでバックエンドに送信

注意点とデメリット

良いところ

  • 直感的な操作でUXが良い
  • 即時プレビューで安心感がある
  • 複数ファイル同時対応も簡単

気をつけること

  • セキュリティ対策が必要(バックエンドでのファイル検証)
  • ファイルサイズ制限や形式チェックが未実装なので要対応

今後の発展アイデア

発展ポイント内容
拡張子・サイズのバリデーション.type.sizeを使って不正ファイルを排除
プログレスバーの追加アップロード進捗を表示して安心感を与える
非同期バッチアップロードPromise.all() で同時アップロード制御
フォルダ対応webkitdirectory 属性でフォルダまるごと読み込み

学習の次のステップ

この機能で習得できたスキル:

  • DOMイベントの活用(drag & drop, change)
  • FormData を使ったファイル送信
  • URL.createObjectURL() を使ったプレビュー表示

次はこんなことに挑戦してみてください!

  • ファイルのプレビューに名前や削除ボタンをつける
  • サーバーからのレスポンスに応じて表示を切り替える
  • ReactやVueなどのフレームワークでも同じように作ってみる

Webフロントエンドの基礎力がグンと伸びるジャンルなので、ぜひトライを続けてくださいね!質問もいつでもどうぞ。