Vue.js实现下载时暂停恢复下载

 更新时间:2025年01月31日 09:58:57   作者:LCG元  
本文主要介绍了Vue.js实现下载时暂停恢复下载,通过使用XMLHttpRequest对象来控制下载过程,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

在 Vue 中实现下载时暂停和恢复功能,通常可以借助 XMLHttpRequest 对象来控制下载过程。XMLHttpRequest 允许在下载过程中暂停和继续请求。

实现步骤

  • 创建 Vue 组件:创建一个 Vue 组件,包含下载、暂停和恢复按钮。
  • 初始化 XMLHttpRequest 对象:在组件中初始化一个 XMLHttpRequest 对象,用于处理下载请求。
  • 实现下载功能:通过 XMLHttpRequest 发起下载请求,并监听下载进度。
  • 实现暂停功能:暂停 XMLHttpRequest 请求。
  • 实现恢复功能:恢复 XMLHttpRequest 请求。

详细代码

<template>
  <div>
    <!-- 下载按钮,点击触发 downloadFile 方法 -->
    <button @click="downloadFile">下载</button>
    <!-- 暂停按钮,点击触发 pauseDownload 方法 -->
    <button @click="pauseDownload" :disabled="!isDownloading || isPaused">暂停</button>
    <!-- 恢复按钮,点击触发 resumeDownload 方法 -->
    <button @click="resumeDownload" :disabled="!isPaused">恢复</button>
    <!-- 显示下载进度 -->
    <p>下载进度: {{ progress }}%</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      xhr: null, // 存储 XMLHttpRequest 对象
      isDownloading: false, // 标记是否正在下载
      isPaused: false, // 标记是否暂停下载
      progress: 0, // 下载进度百分比
      url: 'https://example.com/file.zip', // 下载文件的 URL,需要替换为实际的文件 URL
      resumeOffset: 0 // 恢复下载时的偏移量
    };
  },
  methods: {
    downloadFile() {
      // 创建一个新的 XMLHttpRequest 对象
      this.xhr = new XMLHttpRequest();
      // 打开一个 GET 请求,设置响应类型为 blob
      this.xhr.open('GET', this.url, true);
      this.xhr.responseType = 'blob';

      // 如果有恢复偏移量,设置请求头的 Range
      if (this.resumeOffset > 0) {
        this.xhr.setRequestHeader('Range', `bytes=${this.resumeOffset}-`);
      }

      // 监听下载进度事件
      this.xhr.addEventListener('progress', (event) => {
        if (event.lengthComputable) {
          // 计算下载进度百分比
          this.progress = Math.round((this.resumeOffset + event.loaded) / (this.resumeOffset + event.total) * 100);
        }
      });

      // 监听请求完成事件
      this.xhr.addEventListener('load', () => {
        this.isDownloading = false;
        this.isPaused = false;
        this.resumeOffset = 0;
        // 创建一个临时的 URL 对象
        const url = window.URL.createObjectURL(this.xhr.response);
        // 创建一个 <a> 元素
        const a = document.createElement('a');
        a.href = url;
        a.download = 'file.zip'; // 设置下载文件名
        // 模拟点击 <a> 元素进行下载
        a.click();
        // 释放临时 URL 对象
        window.URL.revokeObjectURL(url);
      });

      // 监听请求错误事件
      this.xhr.addEventListener('error', () => {
        this.isDownloading = false;
        this.isPaused = false;
        console.error('下载出错');
      });

      // 开始发送请求
      this.xhr.send();
      this.isDownloading = true;
      this.isPaused = false;
    },
    pauseDownload() {
      if (this.isDownloading &&!this.isPaused) {
        // 暂停下载,终止 XMLHttpRequest 请求
        this.xhr.abort();
        this.isPaused = true;
        // 记录当前下载的偏移量
        this.resumeOffset += this.xhr.response.byteLength || 0;
      }
    },
    resumeDownload() {
      if (this.isPaused) {
        // 恢复下载,调用 downloadFile 方法
        this.downloadFile();
      }
    }
  }
};
</script>

代码注释

代码中的注释已经详细解释了每一步的作用,以下是一些关键部分的总结:

  • downloadFile 方法:创建 XMLHttpRequest 对象,发起下载请求,监听下载进度和完成事件,处理下载完成后的文件保存。
  • pauseDownload 方法:暂停下载,终止 XMLHttpRequest 请求,并记录当前下载的偏移量。
  • resumeDownload 方法:恢复下载,调用 downloadFile 方法,并设置请求头的 Range 以从指定位置继续下载。

使用说明

  • 替换文件 URL:将 data 中的 url 属性替换为实际要下载的文件的 URL。
  • 引入组件:将上述代码保存为一个 Vue 组件(例如 DownloadComponent.vue),然后在需要使用的地方引入该组件。
<template>
  <div>
    <DownloadComponent />
  </div>
</template>

<script>
import DownloadComponent from './DownloadComponent.vue';

export default {
  components: {
    DownloadComponent
  }
};
</script>
  • 运行项目:在浏览器中运行 Vue 项目,点击“下载”按钮开始下载文件,点击“暂停”按钮暂停下载,点击“恢复”按钮继续下载。

 到此这篇关于Vue.js实现下载时暂停恢复下载的文章就介绍到这了,更多相关Vue.js 下载时暂停恢复下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3组件的v-model:value与v-model的区别解析

    vue3组件的v-model:value与v-model的区别解析

    在Vue3中,v-model和v-model:value都是用于实现双向数据绑定的语法糖,但v-model:value提供了更显式和灵活的绑定方式,允许你明确指定绑定的属性名和事件名,它们的主要区别在于默认行为、灵活性、多模型绑定和使用场景,感兴趣的朋友一起看看吧
    2025-02-02
  • vue3中reactive不能直接赋值的解决方案

    vue3中reactive不能直接赋值的解决方案

    这篇文章主要介绍了vue3中reactive不能直接赋值的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 记录vue项目中遇到的一点小问题

    记录vue项目中遇到的一点小问题

    本文是脚本之家小编给大家收藏整理的关于vue项目中遇到的一点小问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 详解vue渲染函数render的使用

    详解vue渲染函数render的使用

    本篇文章主要介绍了vue渲染函数render的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • vue页面使用多个定时器的方法

    vue页面使用多个定时器的方法

    这篇文章主要为大家详细介绍了vue页面使用多个定时器的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • 关于Echarts饼图图例太长的解决方案

    关于Echarts饼图图例太长的解决方案

    这篇文章主要介绍了关于Echarts饼图图例太长的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • vue实现视频上传功能

    vue实现视频上传功能

    这篇文章主要为大家详细介绍了vue实现视频上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • vue实现图书管理系统

    vue实现图书管理系统

    这篇文章主要为大家详细介绍了vue实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • vue项目接口管理,所有接口都在apis文件夹中统一管理操作

    vue项目接口管理,所有接口都在apis文件夹中统一管理操作

    这篇文章主要介绍了vue项目接口管理,所有接口都在apis文件夹中统一管理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue 动态组件(component :is) 和 dom元素限制(is)用法说明

    vue 动态组件(component :is) 和 dom元素限制(is)用法说明

    这篇文章主要介绍了vue 动态组件(component :is) 和 dom元素限制(is)用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论