ドラッグアンドドロップでファイルアップロード【jQuery・PHP】

チャット系のウェブサービスによくあるのが、ドラッグアンドドロップによるファイル添付です。

今回はそのような機能の実装方法について解説します。

ドラッグアンドドロップでファイルを表示する

デモ

背景がピンクの箇所にローカルの画像をドラッグアンドドロップすると、下部にそのファイルが表示できます。

※送信ボタンは稼働しません

See the Pen Untitled by masahiro nomura (@masahiroview) on CodePen.

コード解説

js(jQuery)のコード解説

//後でファイルをサーバにアップロードするために、配列にファイルを保持しておく
const uploadFilesArray = [];

//デフォルトのドラッグオーバーの挙動(別タブで開く)を停止する。
$('.drag-zone').on('dragover', function(e) {
   e.preventDefault();
});

//マウスを離した際に画像ファイルを描画する
$('.drag-zone').on('drop', function(e) {
  e.preventDefault();
  
  const files = e.originalEvent.dataTransfer.files; 
  const reader = new FileReader();
  
  //ドラッグドロップしたファイルを描画する。
  reader.onload = (event) => {
    const result = event.target.result;
    $('.image-wrapper').append(
      '<div class="attach-file">' +
      '<img class="add-image" src="' + result + '">' +
      '</div>'
    );

    //アップロードファイル一覧に追加
    uploadFilesArray.push(files[0]);
  };
  reader.readAsDataURL(files[0]);
});

各コードの内容についてはコメントをご参照ください。

2行目の変数、uploadFilesArrayはファイルをアップロードするための配列です。

次の項目でこの変数を利用します。

送信ボタンクリックでファイルをアップロードする

js

$('button').on('click', function(e) {
     var fd = new FormData();
     //for文で画像を全てFormDataに追加する
     for(i=0;i<uploadFilesArray.length;i++){
        fd.append("image"+i, uploadFilesArray[i]);
     }
     //ファイル数を保持しておく
     fd.append("upFileLength",uploadFilesArray.length);

   $.ajax({
      url:'sample.php',
      type: 'post',
      data: fd,
      processData: false,
      contentType: false,
    }).then(function (data) {
       console.log(data);
    }).fail(function (error) {
       console.log(error);
 })
});

PHP

//sample.php
<?php 
$upFileLength = h($this->request->getData("upFileLength"));
$extensions = [
  'image/gif' => 'gif',
  'image/jpeg' => 'jpg',
  'image/png' => 'png'
];
$success_flg = true;

for ($i = 0; $i < $upFileLength; $i++) {
    $image = $_POST["image" . $i]; 
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime_type = finfo_buffer($finfo, $image);

    $file_path = "/PATH/image" . $i . "." . $extensions[$mime_type]; 
    if (!file_put_contents($file_path, $image)) {
        $success_flg = false;
    }

    if (!$success_flg) {
        break;
    }
}

if ($success_flg) {
    $data = json_encode(["status", "200"]);
    echo $data;
} else {
    $data = json_encode(["status", "500"]);
    echo $data;
}
?>

コメント

タイトルとURLをコピーしました