Search code examples
javascriptphpjqueryfile-upload

how to upload all images from a folder


trying to upload all images from a folder
destination folder on server side is test
destination format for images is uniqid().jpg

problem - seems resulting array on server side is empty

<input type='file' class='inpfile' id='inpfo' webkitdirectory='' directory='' multiple='true'>  

var inpfo = $('#inpfo');

inpfo.on('change', function(){
    var flist = inpfo[0].files;
    var fd = new FormData();
    fd.append('flist', flist);
    $.ajax({
    url: 'upload.php',
    type: 'POST',
    data: fd,
    async: false,
    contentType: 'multipart/form-data',
    success: function (data){
      console.log(data);  // Undefined array key "flist"
    },
    cache: false,
    contentType: false,
    processData: false
  });
});

upload.php

$arr = $_FILES['flist'];  //seems this is an empty array
foreach($arr as $el){
    $tempname = $el['tmp_name'];
    $uniq = uniqid();
    $img = imagecreatefromjpeg($tempname);
    $targ = 'test/' . $uniq . '.jpg';
    imagejpeg($img, $targ);
}

Solution

  • You are passing a FileList object fd.append which is incorrect you have to loop through the list and add each file individually.

    inpfo.on('change', function(){
        var flist = inpfo[0].files;
        var fd = new FormData();
        for (let i = 0; i < flist.length; i++){ 
            fd.append('flist[]', flist[i]); // add [] to denote array
        }
        $.ajax({
        url: 'upload.php',
        type: 'POST',
        data: fd,
        async: false,
        success: function (data){
          console.log(data);  // Undefined array key "flist"
        },
        cache: false,
        contentType: false,
        processData: false
      });
    });
    

    You're using the array of files incorrect, see here

    $arr = $_FILES['flist'];   
    foreach($arr['tmp_name'] as $tempname){
        $uniq = uniqid();
        $img = imagecreatefromjpeg($tempname);
        $targ = 'test/' . $uniq . '.jpg';
        imagejpeg($img, $targ);
    }