当前位置:首页 > 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 请求头实现大文件分片下载。

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表格实现教学

Vue 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&g…

vue实现好友列表

vue实现好友列表

实现好友列表的Vue组件 数据准备 在Vue组件的data中定义好友列表数据,通常是一个数组对象,每个对象包含好友的基本信息如ID、头像、昵称等。 data() { return { f…

课程表vue实现

课程表vue实现

实现课程表的Vue组件 创建课程表需要设计数据结构、布局和交互逻辑。以下是一个基于Vue 3的实现方案: 数据结构设计 const timetableData = ref([ {…

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Toke…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-i…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-s…