当前位置:首页 > VUE

vue实现断点下载

2026-01-19 13:02:22VUE

vue实现断点下载的方法

使用axios结合Blob对象和localStorage实现断点下载功能。关键在于记录已下载的字节位置,并在中断后恢复下载时从该位置继续。

核心代码实现

安装axios依赖:

npm install axios

在Vue组件中实现逻辑:

import axios from 'axios';

export default {
  data() {
    return {
      downloadedSize: 0,
      totalSize: 0,
      isDownloading: false,
      cancelToken: null
    }
  },
  methods: {
    async startDownload() {
      const url = 'YOUR_FILE_URL';
      const savedProgress = localStorage.getItem('downloadProgress');

      if (savedProgress) {
        this.downloadedSize = parseInt(savedProgress);
      }

      this.isDownloading = true;
      const CancelToken = axios.CancelToken;
      const source = CancelToken.source();
      this.cancelToken = source;

      try {
        const response = await axios({
          method: 'get',
          url: url,
          responseType: 'blob',
          headers: {
            'Range': `bytes=${this.downloadedSize}-`
          },
          cancelToken: source.token,
          onDownloadProgress: (progressEvent) => {
            if (progressEvent.lengthComputable) {
              this.totalSize = progressEvent.total;
              this.downloadedSize = progressEvent.loaded;
              localStorage.setItem('downloadProgress', this.downloadedSize);
            }
          }
        });

        const blob = new Blob([response.data]);
        const link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = 'filename.ext';
        link.click();

        this.resetDownload();
      } catch (error) {
        if (axios.isCancel(error)) {
          console.log('Download canceled');
        } else {
          console.error('Download error:', error);
          this.resetDownload();
        }
      }
    },

    cancelDownload() {
      if (this.cancelToken) {
        this.cancelToken.cancel();
      }
      this.isDownloading = false;
    },

    resetDownload() {
      localStorage.removeItem('downloadProgress');
      this.downloadedSize = 0;
      this.totalSize = 0;
      this.isDownloading = false;
    }
  }
}

关键点说明

使用Range请求头指定下载起始位置,格式为bytes=start-表示从start字节开始下载剩余部分

onDownloadProgress回调函数实时更新下载进度,并将进度保存到localStorage

下载完成后调用resetDownload清除本地存储的进度信息

取消下载时调用cancelToken.cancel()中止请求

界面实现示例

<template>
  <div>
    <button @click="startDownload" :disabled="isDownloading">
      {{ isDownloading ? 'Downloading...' : 'Start Download' }}
    </button>
    <button @click="cancelDownload" v-if="isDownloading">
      Cancel Download
    </button>
    <div v-if="totalSize > 0">
      Progress: {{ (downloadedSize / totalSize * 100).toFixed(2) }}%
    </div>
  </div>
</template>

服务端要求

服务器需要支持Range请求头,常见的静态文件服务器如Nginx、Apache默认支持。如需自定义服务端,需实现类似以下逻辑:

app.get('/download', (req, res) => {
  const range = req.headers.range;
  if (range) {
    const parts = range.replace(/bytes=/, "").split("-");
    const start = parseInt(parts[0], 10);
    // 处理断点续传逻辑
  } else {
    // 普通下载逻辑
  }
});

注意事项

大文件下载建议使用FileSaver.js库处理Blob保存

跨域请求需服务端配置CORS头部

下载进度显示建议添加节流处理避免频繁渲染

本地存储有大小限制(通常5MB),超大文件需考虑其他存储方案

vue实现断点下载

标签: 断点vue
分享给朋友:

相关文章

vue表单实现搜索

vue表单实现搜索

实现Vue表单搜索功能 在Vue中实现表单搜索功能通常涉及表单绑定、事件处理和搜索逻辑。以下是具体实现方法: 数据绑定与表单结构 使用v-model实现表单与Vue数据的双向绑定: <t…

vue查看更多怎么实现

vue查看更多怎么实现

实现 Vue 的“查看更多”功能 数据截取与显示控制 通过 v-if 或 v-show 控制内容的显示与隐藏。初始状态下只显示部分内容,点击“查看更多”后展开完整内容。 <template&…

vue 移动端实现签名

vue 移动端实现签名

Vue 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直…

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginate…

vue实现录音文件播放

vue实现录音文件播放

使用 Vue 实现录音文件播放 准备工作 确保项目中已安装必要的依赖,如 vue-audio-recorder 或原生 Web Audio API。录音文件播放通常涉及录音、存储和播放三个核心环节。…

vue中实现显示和隐藏

vue中实现显示和隐藏

控制显示与隐藏的方法 在Vue中实现元素的显示和隐藏可以通过多种方式完成,以下是常见的几种方法: 1. 使用v-if指令v-if根据条件动态添加或移除DOM元素,适合需要频繁切换的场景。当条件为f…