当前位置:首页 > 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方法:

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方法:

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 实现复选

Vue 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue 实现pdf

vue 实现pdf

在Vue中实现PDF功能 在Vue项目中实现PDF功能通常涉及PDF生成、预览或下载。以下是几种常见实现方式: 使用vue-pdf库预览PDF 安装依赖: npm install vue-pdf…

vue实现vnc

vue实现vnc

Vue 实现 VNC 客户端 在 Vue 项目中实现 VNC 客户端功能,可以通过集成现有的 VNC 客户端库或组件完成。以下是具体实现方法: 安装依赖库 使用 noVNC 或其他 VNC 客户端…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

vue实现注册

vue实现注册

Vue 实现注册功能 注册功能通常涉及前端表单、数据验证、与后端 API 的交互等步骤。以下是一个完整的 Vue 实现注册功能的方案。 创建注册表单 使用 Vue 的模板语法创建注册表单,包含用户名…

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…