如何使用 javascript 调整多个图像的大小并使用 ajax 保存在 mysql 中

how multiple image resize by using javascript and save in mysql by using ajax

这是我用来在 javascript 中调整图像大小和压缩图像的代码,它工作正常,并且还通过 ajax 在 mysql 中发送了一张图像,但问题是我想在数据库中发送四张图像还有一些额外的字段。现在我想要 imgCompressResize 函数只传递图像参数和 return 压缩和调整图像大小以便我可以根据需要保存。

<input type="file" name="img1" id="file1" accept="image/*">

document.getElementById("file1").addEventListener("change", function (e) {
    var file = imgCompressResize(e);
    var data = new FormData();
    data.append('file1', file);
    $.ajax({
        url:"page.php",
        type:"POST",
        data:data,
        cache: false,
        contentType: false,
        processData: false,
        success:function (data) {
            alert(data);
        }
    });

});

function imgCompressResize(e) {
            const width = 500;
            const height = 600;
            var file;
            const fileName = e.target.files[0].name;
            console.log(fileName);
            const reader = new FileReader();
            reader.readAsDataURL(e.target.files[0]);
            reader.onload = event => {
                const img = new Image();
                img.src = event.target.result;
                img.onload = () => {
                    const elem = document.createElement('canvas');
                    elem.width = width;
                    elem.height = height;
                    const ctx = elem.getContext('2d');
                    ctx.drawImage(img, 0, 0, width, height);
                    ctx.canvas.toBlob((blob) => {
                    file = new File([blob], fileName, {
                            type: 'image/jpeg',
                            lastModified: Date.now()
                        });
                        return file;
                        // if i call here ajax() function that working for one image but i don't need 
                        // call here ajax().
                    }, 'image/jpeg', .7);
                },
                reader.onerror = error => console.log(error);
            }
        }

由于 onload 是异步的,所以我不会重写整个内容,只是简单地向您概述如何使用 promises。

document.getElementById("file1").addEventListener("change", function(e) {
  const filesArray = Array.from(this.files);
  // map array of each resize promise 
  const filePromises = filesArray.map(imgCompressResize);
  
  var data = new FormData();
  // when all resolved append to FormData
  Promise.all(filePromises).then(newFiles =>{
     newFiles.forEach(f=> data.append('files[]', f) 
  });
  // append other fields needed    
  //then  do ajax    
})

function imgCompressResize(file) {
                         // ^^ file instead of event
  // return promise
  return new Promise((resolve, reject) => {
    //...
    //const fileName = e.target.files[0].name;
    const fileName = file.name;
    const reader = new FileReader();
    reader.readAsDataURL(file);    
    reader.onload = event => {
      //...
      img.onload = () => {
        //....
        const newFile = new File([blob], fileName, {...);
        // resolve the promise
        resolve(newFile);
      });
    });
      
  });

   reader.onerror = reject
}