当前位置:首页 > VUE

vue实现下载暂停

2026-01-07 04:41:26VUE

Vue实现下载暂停功能

在Vue中实现下载暂停功能,通常需要结合XMLHttpRequest或Fetch API的AbortController来控制请求中断。以下是具体实现方法:

使用XMLHttpRequest实现

创建XMLHttpRequest对象并存储其引用,便于后续操作:

data() {
  return {
    xhr: null,
    downloadProgress: 0,
    isPaused: false
  }
}

发起下载请求时保存xhr对象:

downloadFile() {
  this.xhr = new XMLHttpRequest();
  this.xhr.open('GET', 'file-url', true);
  this.xhr.responseType = 'blob';

  this.xhr.onprogress = (event) => {
    if (event.lengthComputable) {
      this.downloadProgress = Math.round((event.loaded / event.total) * 100);
    }
  };

  this.xhr.onload = () => {
    if (this.xhr.status === 200) {
      const blob = new Blob([this.xhr.response]);
      const link = document.createElement('a');
      link.href = URL.createObjectURL(blob);
      link.download = 'filename.ext';
      link.click();
    }
  };

  this.xhr.send();
}

暂停下载时调用abort方法:

vue实现下载暂停

pauseDownload() {
  if (this.xhr) {
    this.xhr.abort();
    this.isPaused = true;
  }
}

使用Fetch API实现

结合AbortController实现更现代的暂停控制:

data() {
  return {
    controller: null,
    downloadProgress: 0,
    isPaused: false
  }
}

发起请求时创建AbortController:

async downloadFile() {
  this.controller = new AbortController();
  try {
    const response = await fetch('file-url', {
      signal: this.controller.signal
    });

    const reader = response.body.getReader();
    const contentLength = +response.headers.get('Content-Length');
    let receivedLength = 0;
    let chunks = [];

    while(true) {
      const {done, value} = await reader.read();
      if (done) break;

      chunks.push(value);
      receivedLength += value.length;
      this.downloadProgress = Math.round((receivedLength / contentLength) * 100);
    }

    const blob = new Blob(chunks);
    const link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = 'filename.ext';
    link.click();
  } catch (err) {
    if (err.name === 'AbortError') {
      console.log('Download aborted');
    }
  }
}

暂停时调用abort方法:

vue实现下载暂停

pauseDownload() {
  if (this.controller) {
    this.controller.abort();
    this.isPaused = true;
  }
}

实现断点续传

对于大文件下载,可考虑实现断点续传:

resumeDownload() {
  const rangeHeader = `bytes=${this.downloadedBytes}-`;
  fetch('file-url', {
    headers: { 'Range': rangeHeader },
    signal: this.controller.signal
  });
  // 处理后续分块下载逻辑
}

注意服务端需要支持Range请求头,并正确处理206 Partial Content响应。

UI状态管理

在模板中绑定下载状态:

<button @click="downloadFile" :disabled="!!xhr && !isPaused">
  {{ isPaused ? 'Resume' : 'Download' }}
</button>
<button @click="pauseDownload" :disabled="!xhr || isPaused">
  Pause
</button>
<progress :value="downloadProgress" max="100"></progress>

这种方法提供了基本的下载控制功能,可根据实际需求扩展更复杂的逻辑。

标签: vue
分享给朋友:

相关文章

vue实现级联

vue实现级联

Vue 实现级联选择器的方法 级联选择器(Cascader)是常见的表单组件,用于处理多层级联动数据选择(如省市区选择)。以下是几种实现方式: 基于 Element UI 的 el-cascader…

vue权限实现

vue权限实现

Vue 权限实现方案 基于路由的权限控制 通过路由守卫实现权限验证,在路由配置中添加meta字段标记权限要求。在router.beforeEach中检查用户权限与路由要求的匹配情况。 // rout…

vue实现radio

vue实现radio

Vue 实现 Radio 按钮 在 Vue 中实现 Radio 按钮可以通过 v-model 进行数据绑定,结合 input 元素的 type="radio" 属性。以下是一个基本示例: <t…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…

vue实现气泡

vue实现气泡

Vue 实现气泡效果的方法 在 Vue 中实现气泡效果可以通过 CSS 动画、第三方库或自定义组件完成。以下是几种常见实现方式: 使用纯 CSS 和 Vue 过渡 通过 Vue 的过渡系统结合 CS…

vue实现秒表

vue实现秒表

实现秒表功能 在Vue中实现秒表功能需要处理时间显示、开始、暂停和重置逻辑。以下是具体实现方式: 基础实现代码 <template> <div> <div&…