ajax 上传文件,监听进度(progress)

Posted Ajanuw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ajax 上传文件,监听进度(progress)相关的知识,希望对你有一定的参考价值。

mdn

前端代码 github

<body class="m-2">
  <label for="a" class="btn btn-primary">点击上传</label>
  <input id=\'a\' name="file" type="file" accept="image/png, image/jpeg, video/*" style="display:none;" multiple=\'multiple\'>
  <script>
    async function main() {

      const l = console.log
      let fileEle = document.querySelector(\'#a\')
      fileEle.onchange = e => {
        let files = fileEle.files
        if(files.length === 0) return false;

        let data = new FormData()
        for(const file of files){
          data.append(\'files\', file)
        }

        let xhr = new XMLHttpRequest()
        
        xhr.upload.addEventListener(\'progress\', e => {
          if (e.lengthComputable) {
            var percentage = Math.round((e.loaded * 100) / e.total);
            l(`${percentage}%`)
          }
        })

        xhr.open(\'post\', \'http://localhost:5000/upload\')
        xhr.responseType = \'json\'
        xhr.send(data)

        xhr.upload.addEventListener(\'loadstart\', e => {
          l(\'上传开始\')
        })
        
        xhr.upload.addEventListener(\'error\', e => {
          l(\'上传失败\')
        })

        xhr.upload.addEventListener(\'abort\', e => {
          l(\'上传终止\')
        })

        xhr.upload.addEventListener(\'timeout\', e => {
          l(\'由于预设时间到期,上传终止\')
        })

        xhr.upload.addEventListener(\'load\', e => {
          l(\'上传成功了\')
        })

        xhr.upload.addEventListener(\'loadend\', e => {
          l(\'上传已经停止了\')
        })

        xhr.onload = () => {
          l(...xhr.response.imgsSrc);
        }

      }
    }
    main();
  </script>
</body>

</html>

后台代码片段

  @Post(\'upload\')
  @UseInterceptors(FilesInterceptor(\'files\'))
  uploadfile(@UploadedFiles() files, @Body() body) {

    if (!files || files.length === 0) {
      throw new HttpException(\'参数错误\', HttpStatus.FORBIDDEN)
    }

    let imagesSrc = []
    for (const file of files) {
      const imgName = `${Date.now()}-${file.originalname}`
      const writeImage = createWriteStream(join(__dirname, \'..\', \'upload\', imgName))
      writeImage.write(file.buffer)
      imagesSrc.push( `http://localhost:5000/images/${imgName}` )
    }
    return {
      imgsSrc: imagesSrc
    }
  }

以上是关于ajax 上传文件,监听进度(progress)的主要内容,如果未能解决你的问题,请参考以下文章

[转]文件上传进度显示

struts+ajax上传文件进度条的问题

移动端web JS JDK上传文件 使用progress获取上传进度 无法正常使用

ajax监听上传进度

PHP利用Session实现上传进度

如何在jquery中计算文件上传进度?