如何分别为每个上传的图像设置从 0 到 100% 的进度条

How to set progress bar from 0 to 100% for each uploaded image separately

提问人:provance 提问时间:7/8/2023 最后编辑:marc_sprovance 更新时间:7/23/2023 访问量:33

问:

我想上传多个图像,但在单独的 XMLHttpRequest 中。

请求应按顺序(一个接一个)执行,而不是同时执行。

那是因为我希望每个上传图像的进度条从 0 到 100%。

使用此代码似乎请求是同时执行的,因为:

  • 进度条闪烁 - 不断前后移动
  • All in Console 同时出现,即在整个过程结束时出现finito

如果我写而不是:ajax.open("POST", "a_pro_up.php, false")ajax.open("POST", "a_pro_up.php");

  • finitos在控制台中按顺序显示
  • 但是进度条根本不起作用

如何分别获得每个上传图像的流畅上升进度条?

<input type="file" class='inpfi' id='inpimg' multiple accept="image/jpeg">
<progress class='pbar' id='pbar' value='0' max='100'> 0% </progress>

   inpimg.on('change', function(){
        var files = inpimg[0].files;
        for(var i = 0; i < files.length; i++){
            var file = files[i];
            var fd = new FormData();
            fd.append('id', urw);
            fd.append('upimg', file);
            var ajax = new XMLHttpRequest();
            ajax.upload.addEventListener("progress", up_progress, false);
            ajax.addEventListener("load", up_img_finito, false);
            ajax.open("POST", "a_pro_up.php");
            ajax.send(fd);
        }
    });  

function up_progress(e){
    let percent = (e.loaded / e.total) * 100;
    pbar.val(Math.round(percent));
}

function up_img_finito(){
    console.log('finito');
}
JavaScript ajax xmlhttp请求

评论

0赞 Konrad 7/8/2023
是的,请求同时运行
0赞 Venkatesh 7/8/2023
通过阅读它,您正在发送多个文件,就我而言,我正在发送单个文件,但我没有得到进展,您能帮我 stackoverflow.com/questions/76625377/ 吗......
0赞 provance 7/8/2023
@Konrad - 进度条呢?看到它前后闪烁,而不是流利地分别为每张图像,这是非常丑陋的?

答:

1赞 mplungjan 7/8/2023 #1

我建议永远不要循环 ajax。

这是一个根据需要按顺序运行的版本

let files, cnt = 0,
  max = 0;

const up_img_finito = () => {
  console.log('finito', cnt);
  cnt++
  upload();
}
const up_progress => (e) {
  let percent = (e.loaded / e.total) * 100;
  pbar.val(Math.round(percent));
};

const upload = () => {
  if (cnt >= max) {
    up_img_finito()
    return;
  }
  let file = files[i];
  let fd = new FormData();
  fd.append('id', urw);
  fd.append('upimg', file);
  let ajax = new XMLHttpRequest();
  ajax.upload.addEventListener("progress", up_progress, false);
  ajax.addEventListener("load", up_img_finito, false);
  ajax.open("POST", "a_pro_up.php");
  ajax.send(fd);
};
document.getElementById('inpimg').addEventListener('change', () => {
  files = inpimg[0].files;
  max = files.length;
  upload()
});