LoginSignup
0
0

More than 1 year has passed since last update.

jQueryで画像一括アップロードを作ったよ

Last updated at Posted at 2022-09-10

解説

ファイルを複数選択してドラッグ&ドロップしてファイルを一括アップロードする処理を書きました。
Deferredを使って、ファイルアップロードが全部終わったらローディングアイコンを消すようにしました。
※サーバ側の処理は自分で実装してください…。

実装

HTML

<!-- 画像ドラッグ&ドロップ -->
<div class="drop_area_multiple">
    <input type="file" name="file" multiple="multiple" class="inputfile">
    <div class="drop_text1">ここにファイルをまとめてドロップ</div>
</div>

CSS

.drop_area_multiple {
  border: 2px dashed gray;
  text-align: center;
  background: #ffffff;
  width: 447px;
  line-height: 150px;
}
.dragtarget {
    background: #EDEDED;
}
.enter {
  background: linear-gradient(
    -45deg,
    rgb(218, 215, 215) 25%,
    #f5f1f1 25%,
    #f5f1f1 50%,
    rgb(218, 215, 215) 50%,
    rgb(218, 215, 215) 75%,
    #f5f1f1 75%,
    #f5f1f1
  );
  background-size: 40px 40px;
  animation: anime_stripe_1 0.8s infinite linear;
}
.disabled_drag_drop {
  pointer-events: none;
  opacity: 0.4;
}
@keyframes anime_stripe_1 {
  0% {
    background-position-x: 0;
  }
  100% {
    background-position-x: -40px;
  }
}
.pointer_off {
  pointer-events: none;
}

.drop_text1 {
  text-align: center;
  pointer-events: none;
  padding-bottom: 5px;
  color: #8A87B6;
}
.drop_input {
  text-align: center;
}
input.inputfile {
 display: none;
}

JavaScript

// ドラッグしている要素がドロップ領域に入ったとき・領域にある間
$('.drop_area_multiple').on('dragenter dragover', function (event) {
    event.stopPropagation();
    event.preventDefault();
    $(this).addClass('enter');
});
$('.drop_area_multiple').on('dragleave', function (event) {
    event.stopPropagation();
    event.preventDefault();
    $(this).removeClass('enter');
});

// 画像一括アップロード
$('.drop_area_multiple').on('drop', function (event) {
    event.preventDefault();

    var files = event.originalEvent.dataTransfer.files;
   
    showLoading();// ローディングアイコン出したり…

    // 並列処理
    var promises = [];
    for (var i=0; i<files.length; i++) {
        var file = files[i];
        promises.push(ajax_upload(file));
    }

    $.when.apply(null, promises).then(function() {
        hideLoading();
    });
    
    $(this).removeClass('enter');
});

// 画像アップロード
function ajax_upload(file) {
    var deferred = $.Deferred();

    let fd = new FormData();
    fd.append("file", file);
    
    let options = {
        type:'POST',
        url: '/upload_image.php',
        data: fd,
        cache: false,
        contentType: false,
        processData: false,
        dataType: 'json'
    };

    $.ajax(
        options
    ).done(function(d){
        console.log(d)
        deferred.resolve();
        
    }).fail(function(d){
        deferred.reject();
    }).always(function(){
        //完了
    });

    return deferred.promise();
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0