もくじ
Webサイトでのファイルアップロード機能は、ユーザーにとって非常に重要な要素です。
中でも、ドラッグ&ドロップによるファイルアップロードは直感的な操作が可能なため、ユーザビリティの向上につながります。
この記事では、JavaScriptを使ってドラッグ&ドロップでファイルをアップロードする機能を実装する方法と、開発時に気をつけたい注意点を解説します。
ドラッグ&ドロップで要素を移動する方法は以下の記事で紹介しています。
-   
- 【JavaScript】ドラッグ&ドロップで要素を移動する方法とサンプルコード - もくじ【サンプル】ドラッグ&ドロップで特定のエリア内で要素を自由に動かす【実装コード】ドラッグ&ドロップで特定のエリア内で要素を自由に動かす【サンプル】ドラッグ&ドロップでリスト要素を並び替える【実装 ... 
【サンプル】ドラッグ&ドロップによるファイルアップロード機能
選択されたファイル:
【実装コード】ドラッグ&ドロップによるファイルアップロード機能
Copyをクリックするとコピーできます。
  <div class="file-upload-container">    <div id="drop-area" class="drop-area">      <p class="drop-message">ここにファイルをドラッグ&ドロップ<br>または</p>      <label for="file-input" class="visually-hidden">ファイルを選択してください</label>      <input type="file" id="file-input" class="file-input" multiple>      <button id="select-file-btn" class="select-file-btn">ファイルを選択する</button>      <button id="change-file-btn" class="change-file-btn">ファイルを変更する</button>    </div>    <p class="file-upload-text">選択されたファイル:</p>    <div id="file-list" class="file-list"></div>  </div>.drop-area {  display: flex;  flex-direction: column;  justify-content: center;  align-items: center;  min-height: 200px;  margin-bottom: 1em;  padding: 1em;  text-align: center;  border: dashed 2px #ccc;  border-radius: 5px;}.drop-area.is-dragover {  background: #f0f0f0;  border-color: #666;}.drop-message {  margin-bottom: 0.5em;}.visually-hidden {  position: absolute;  width: 1px;  height: 1px;  margin: -1px;  padding: 0;  overflow: hidden;  clip: rect(0, 0, 0, 0);  border: 0;}.file-input {  display: none;}.select-file-btn,.change-file-btn {  padding: 0.5em 1em;  color: #fff;  background: #3c3c3c;  border: none;  border-radius: 5px;  transition: 0.3s;  cursor: pointer;}.select-file-btn:hover,.change-file-btn:hover {  opacity: 0.8;}.change-file-btn {  display: none;}.file-upload-text {  margin: 0 0 0.5em;}.file-list p {  margin: 0 0 0.5em;}.file-list p:last-child {  margin-bottom: 0;}const dropArea = document.getElementById('drop-area');const fileInput = document.getElementById('file-input');const selectFileBtn = document.getElementById('select-file-btn');const changeFileBtn = document.getElementById('change-file-btn');const fileList = document.getElementById('file-list');let selectedFiles = [];// ドラッグ&ドロップイベントdropArea.addEventListener('dragover', (e) => {  e.preventDefault();  dropArea.classList.add('is-dragover');});dropArea.addEventListener('dragleave', () => {  dropArea.classList.remove('is-dragover');});dropArea.addEventListener('drop', (e) => {  e.preventDefault();  dropArea.classList.remove('is-dragover');  selectedFiles = Array.from(e.dataTransfer.files);  displayFileList(selectedFiles);});// ボタンによるファイル選択selectFileBtn.addEventListener('click', () => {  fileInput.click();});changeFileBtn.addEventListener('click', () => {  fileInput.click();});// input経由でファイルが選択されたときfileInput.addEventListener('change', () => {  selectedFiles = Array.from(fileInput.files);  displayFileList(selectedFiles);});// ファイルリストを表示するfunction displayFileList(files) {  fileList.innerHTML = '';  files.forEach((file) => {    const item = document.createElement('p');    item.textContent = file.name;    fileList.appendChild(item);  });  // ボタンの切り替え処理  if (files.length > 0) {    selectFileBtn.style.display = 'none';    changeFileBtn.style.display = 'inline-block';  } else {    selectFileBtn.style.display = 'inline-block';    changeFileBtn.style.display = 'none';  }}サーバーへのアップロード処理(擬似)
バックエンドの実装は割愛しますが、以下はフロントエンド側での処理の例です。
「アップロードする」ボタンを設置して、アップロードされたファイルをサーバー側に転送しています。
Copyをクリックするとコピーできます。
<button id="upload-btn" class="upload-btn">アップロードする</button>const uploadBtn = document.getElementById('upload-btn');// アップロード処理(擬似)uploadBtn.addEventListener('click', () => {  if (selectedFiles.length === 0) {    alert('ファイルを選択してください');    return;  }  const formData = new FormData();  selectedFiles.forEach((file) => {    formData.append('files[]', file);  })  fetch('/upload.php', {    method: 'POST',    body: formData  })    .then((response) => {      if (!response.ok) {        throw new Error(`HTTPエラー: ${response.status}`);      }      return response.text();    })    .then((data) => {      console.log(data);      alert('アップロード成功しました');    })    .catch((error) => {      console.error('アップロード失敗:', error);      alert('アップロードに失敗しました');    });});よくあるエラーと対処法
| エラー内容 | 対処法 | 
|---|---|
| ドラッグしても反応しない | preventDefault()を忘れていないか確認 | 
| CORSエラー | サーバー側のCORS設定を確認 | 
実装時の注意点とセキュリティ
| 複数ファイルの対応 | multiple属性が必要 | 
|---|---|
| 拡張子チェック | JS側・サーバー側でMIMEタイプのバリデーションを行う | 
| サーバー側の対策 | ファイル名のサニタイズ、保存先制限、ウイルスチェックなどを行う | 
まとめ
ドラッグ&ドロップによるファイルアップロードは、JavaScriptを使えば比較的簡単に実装できます。
ユーザーの利便性を高めるためにも、積極的に取り入れてみましょう。
ただし、セキュリティやユーザー体験に関する配慮は不可欠です。
今回紹介した注意点も参考に、安全で使いやすいファイルアップロード機能を実現してください。
ドラッグ&ドロップで要素を移動する方法は以下の記事で紹介しています。
-   
- 【JavaScript】ドラッグ&ドロップで要素を移動する方法とサンプルコード - もくじ【サンプル】ドラッグ&ドロップで特定のエリア内で要素を自由に動かす【実装コード】ドラッグ&ドロップで特定のエリア内で要素を自由に動かす【サンプル】ドラッグ&ドロップでリスト要素を並び替える【実装 ... 

