Skip to content

Axios 进度监控


loading

上传下载进度监控,使用onUploadProgress事件

request.js
js
// 进度百分比(上传/下载)
const progress = ref({ upload: 0, download: 0 }) // 进度
// 已上传/下载的字节数
const downloadedSize = ref({ upload: 0, download: 0 }) // 已上传/下载的大小
// 总字节数
const totalSize = ref({ upload: 0, download: 0 }) // 总大小
// 选中的文件对象
const file = ref(null)

// 上传事件
onUploadProgress: progressEvent => {
  downloadedSize.value.upload = progressEvent.loaded // 已上传字节数
  totalSize.value.upload = progressEvent.total // 总字节数
  if (progressEvent.lengthComputable) {
    // 百分比
    progress.value.upload = Math.round((progressEvent.loaded / progressEvent.total) * 100)
  }
}

// 下载事件
onDownloadProgress: progressEvent => {
  downloadedSize.value.download = progressEvent.loaded // 已上传字节数
  totalSize.value.download = progressEvent.total // 总字节数
  if (progressEvent.lengthComputable) {
    // 百分比
    progress.value.download = Math.round((progressEvent.loaded / progressEvent.total) * 100)
  }
}

进度百分比、传输大小、总文件大小

50%(26.49 KB / 52.98 B)

vue
<div v-if="progress.download > 0">
  {{ progress.download }}%({{ formatSize(downloadedSize.download) }} / {{ formatSize(totalSize.download) }})
</div>

格式化文件大小

loading
js
// 格式化文件大小
const formatSize = bytes => {
  if (bytes === 0 || !bytes) return '0 B'
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

formatSize(1073741824) // 1 GB

axios取消请求

js
const controller = ref(null)
// 请求
controller.value = new AbortController()
let res = await axios.get('#',{
  signal: controller.value.signal
})
//取消
controller.value.abort()
controller.value = null

Blob转ObjectURL并下载

js
function BlobDownload(blob, name) {
  const url = window.URL.createObjectURL(blob)
  const link = document.createElement('a')
  link.href = url
  link.download = name
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  window.URL.revokeObjectURL(url)
}

Released under the MIT License.