当前位置:首页 > VUE

vue 实现下载功能

2026-01-21 10:26:43VUE

使用 window.open 直接下载

通过 window.open 直接打开文件链接触发下载,适用于简单的文件下载场景。

window.open('文件URL', '_blank');

使用 <a> 标签下载

动态创建 <a> 标签并设置 download 属性,适合需要自定义文件名的情况。

const link = document.createElement('a');
link.href = '文件URL';
link.download = '自定义文件名.txt'; // 设置下载文件名
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

通过 Blob 对象下载

适用于需要处理二进制数据或后端返回文件流的场景。

axios.get('文件URL', { responseType: 'blob' }).then(response => {
  const url = window.URL.createObjectURL(new Blob([response.data]));
  const link = document.createElement('a');
  link.href = url;
  link.download = '文件名.pdf';
  link.click();
  window.URL.revokeObjectURL(url); // 释放内存
});

下载后端返回的 Base64 数据

将 Base64 数据转换为 Blob 后下载。

function downloadBase64(base64Data, fileName) {
  const byteCharacters = atob(base64Data.split(',')[1]);
  const byteNumbers = new Array(byteCharacters.length);
  for (let i = 0; i < byteCharacters.length; i++) {
    byteNumbers[i] = byteCharacters.charCodeAt(i);
  }
  const byteArray = new Uint8Array(byteNumbers);
  const blob = new Blob([byteArray], { type: 'application/octet-stream' });
  const url = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  link.download = fileName;
  link.click();
}

封装为 Vue 方法

在 Vue 组件中封装可复用的下载方法。

methods: {
  downloadFile(url, fileName) {
    const link = document.createElement('a');
    link.href = url;
    link.download = fileName || url.split('/').pop();
    link.style.display = 'none';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  }
}

处理大文件分片下载

通过 Range 请求头实现大文件分片下载。

vue 实现下载功能

async function downloadLargeFile(url, fileName, chunkSize = 1024 * 1024) {
  const response = await fetch(url, { headers: { Range: `bytes=0-${chunkSize}` } });
  const totalSize = parseInt(response.headers.get('content-range').split('/')[1]);
  const blob = await response.blob();
  const chunks = [blob];

  for (let start = chunkSize; start < totalSize; start += chunkSize) {
    const end = Math.min(start + chunkSize, totalSize);
    const chunkResponse = await fetch(url, { headers: { Range: `bytes=${start}-${end}` } });
    chunks.push(await chunkResponse.blob());
  }

  const finalBlob = new Blob(chunks);
  const link = document.createElement('a');
  link.href = URL.createObjectURL(finalBlob);
  link.download = fileName;
  link.click();
}

注意事项

  • 跨域下载需确保服务器配置 CORS 头部(如 Access-Control-Allow-Origin)。
  • 动态生成 URL 时注意内存释放,调用 URL.revokeObjectURL()
  • 移动端部分浏览器可能限制自动下载,需用户主动触发事件。
  • 文件名包含中文时建议使用 encodeURIComponent() 处理。

标签: 功能vue
分享给朋友:

相关文章

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身: &…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue 实现视频

vue 实现视频

Vue 实现视频播放功能 使用 Vue 实现视频播放功能可以通过 HTML5 的 <video> 标签或第三方库(如 video.js)来实现。以下是两种常见的方法: 使用 HTML5…