【js】监听文件上传下载进度,设置请求头信息与获取响应头信息

监听文件上传下载进度

例子:html部分

<input type="file" id="selectFile">
<span id="progress1"></span>

<button id="downloadFile">download</button>
<span id="progress2"></span>

原生xhr实现

const selectFile = document.querySelector('#selectFile')
const progress1 = document.querySelector('#progress1')

const downloadFile = document.querySelector('#downloadFile')
const progress2 = document.querySelector('#progress2')

selectFile.addEventListener('change', e => {
  const file = e.target.files[0]
  const xhr = new XMLHttpRequest()

  // 跟踪上传进度
  xhr.upload.onprogress = function(event) {
    const percent = Math.floor((event.loaded / event.total) * 100)
    progress1.innerHTML = percent + '%'
    console.log(`Uploaded ${event.loaded} of ${event.total}, ${percent}%`)
  }

  // 跟踪完成:无论成功与否
  xhr.onloadend = function() {
    if (xhr.status == 200) {
      console.log("success")
    } else {
      console.log("error " + this.status)
    }
  }

  xhr.open("POST", "upload.php")
  xhr.send(file)
})

downloadFile.addEventListener('click', e => {
  const xhr = new XMLHttpRequest()

  xhr.onprogress = function(event) {
    if (event.lengthComputable) {
      const percent = Math.floor((event.loaded / event.total) * 100)
      progress2.innerHTML = percent + '%'
      console.log(`Received ${event.loaded} of ${event.total} bytes`)
    } else {
      console.log(`Received ${event.loaded} bytes`) // 没有 Content-Length
    }
  }

  // 跟踪完成:无论成功与否
  xhr.onloadend = function() {
    if (xhr.status == 200) {
      console.log("success")
    } else {
      console.log("error " + this.status)
    }
  }

  xhr.open("GET", "imgs/demo.mp4")
  xhr.send()
})

使用axios库

const selectFile = document.querySelector('#selectFile')
const progress1 = document.querySelector('#progress1')

const downloadFile = document.querySelector('#downloadFile')
const progress2 = document.querySelector('#progress2')
selectFile.addEventListener('change', e => {
  const file = e.target.files[0]

  axios({
    url: 'upload.php',
    method: 'post',
    data: file,
    onUploadProgress: event => {
      // axios已经对progress进行了封装,可以直接获取计算好的值
      // const percent = Math.floor((event.loaded / event.total) * 100)
      const percent = Math.floor(event.progress * 100)
      progress1.innerHTML = percent + '%'
      console.log(`Uploaded ${event.loaded} of ${event.total}, ${percent}%`)
    }
  }).then(res => {
    const body = res.data
    console.log(body)
  })
})

downloadFile.addEventListener('click', e => {
  axios({
    url: 'imgs/demo.mp4',
    method: 'get',
    onDownloadProgress: event => {
      // axios已经对progress进行了封装,可以直接获取计算好的值
      // const percent = Math.floor((event.loaded / event.total) * 100)
      const percent = Math.floor(event.progress * 100)
      progress2.innerHTML = percent + '%'
      console.log(`Received ${event.loaded} of ${event.total} bytes`)
    }
  }).then(res => {
    console.log('success')
  })
})

设置请求头信息与获取响应头信息

原生xhr实现

const xhr = new XMLHttpRequest()

// 跟踪上传进度
xhr.upload.onprogress = function(event) {
  console.log('progress:', event)
  const percent = Math.floor((event.loaded / event.total) * 100)
  progress1.innerHTML = percent + '%'
  console.log(`Uploaded ${event.loaded} of ${event.total}, ${percent}%`)
}

// 跟踪完成:无论成功与否
xhr.onloadend = function() {
  if (xhr.status == 200) {
    // 此处获取服务端额外返回的响应header,名字叫X-My-Custom-Header
    const serverExtraHeader = xhr.getResponseHeader('X-My-Custom-Header')
    // 获取服务器返回的响应Date字段(一般apache和nginx都能返回的服务器时间)
    const serverDate = xhr.getResponseHeader('Date')
    const handlerDate = new Date(serverDate)
    console.log("success:", handlerDate, serverExtraHeader)
  } else {
    console.log("error " + this.status)
  }
}

xhr.open("POST", "upload.php")
// 设置更多的请求header,必须放在open之后
xhr.setRequestHeader('extra-header', 'extra-header-value')
xhr.send(file)

使用axios库

axios({
  url: 'upload.php',
  method: 'post',
  data: file,
  // 设置更多的请求header
  header: {
    'extra-header': 'extra-header-value'
  },
  onUploadProgress: event => {
    console.log('event:', event)
    // const percent = Math.floor((event.loaded / event.total) * 100)
    const percent = Math.floor(event.progress * 100)
    progress1.innerHTML = percent + '%'
    console.log(`Uploaded ${event.loaded} of ${event.total}, ${percent}%`)
  }
}).then(res => {
  const body = res.data
  // 获取服务端/服务器返回的响应header,注意:由于axios进行了封装,所有header的key都变成了小写
  const headers = res.headers
  const serverExtraHeader = headers['x-my-custom-header']
  const serverDate = headers['date']
  console.log(body, serverExtraHeader, serverDate)
})

相关推荐

  1. django获取request请求信息获取Content-Type

    2024-04-03 14:24:02       36 阅读
  2. js的生成a标签下载文件,同时设置请求

    2024-04-03 14:24:02       36 阅读
  3. curl获取http请求响应

    2024-04-03 14:24:02       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 14:24:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 14:24:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 14:24:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 14:24:02       20 阅读

热门阅读

  1. audio_video_img图片音视频异步可视化加载

    2024-04-03 14:24:02       14 阅读
  2. 2024年3月调研学习文档资料汇总

    2024-04-03 14:24:02       13 阅读
  3. Vulkan Material 设计学习

    2024-04-03 14:24:02       15 阅读
  4. 自然语言处理(NLP):揭秘AI领域的“语言大师

    2024-04-03 14:24:02       15 阅读
  5. 如何搭建一个免费的源代码托管工具?

    2024-04-03 14:24:02       12 阅读
  6. python - 实现一个通用的插件类

    2024-04-03 14:24:02       13 阅读
  7. Matlab未装工具箱

    2024-04-03 14:24:02       17 阅读
  8. excel wps中编码格式转换

    2024-04-03 14:24:02       17 阅读
  9. Unity自定义框架开发

    2024-04-03 14:24:02       14 阅读