当前位置:首页 > VUE

vue前端实现文件下载

2026-01-20 06:03:23VUE

使用 window.open 直接下载

通过 window.open 直接打开文件链接触发下载,适用于简单的文件下载场景。
将文件 URL 作为参数传入,浏览器会自动处理下载行为:

window.open('https://example.com/file.pdf', '_blank');

使用 <a> 标签动态触发下载

创建隐藏的 <a> 标签,设置 download 属性后模拟点击,适合需要自定义文件名的情况:

vue前端实现文件下载

const link = document.createElement('a');
link.href = 'https://example.com/file.pdf';
link.download = 'custom-filename.pdf'; // 指定下载文件名
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

通过 Blob 对象下载二进制数据

当需要处理后端返回的二进制流(如 Axios 响应)时,可通过 Blob 转换并下载:

vue前端实现文件下载

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

处理大文件分片下载

对于大文件下载,可结合 Content-Range 实现分片下载与合并:

async function downloadLargeFile(url, fileName, chunkSize = 1024 * 1024) {
  let startByte = 0;
  const chunks = [];

  while (true) {
    const response = await fetch(url, {
      headers: { 'Range': `bytes=${startByte}-${startByte + chunkSize}` }
    });
    if (!response.ok) break;
    chunks.push(await response.blob());
    startByte += chunkSize;
  }

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

添加下载进度提示

通过 Axios 的 onDownloadProgress 实现进度显示:

axios({
  url: '/api/download',
  method: 'GET',
  responseType: 'blob',
  onDownloadProgress: progressEvent => {
    const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
    console.log(`下载进度: ${percent}%`);
  }
}).then(response => {
  // 处理下载完成逻辑
});

注意事项

  • 跨域问题需确保服务器配置 Access-Control-Allow-Origin
  • 部分浏览器可能限制非用户触发的下载行为,建议在按钮点击事件中触发
  • 移动端需测试兼容性,部分浏览器对 download 属性支持有限

标签: 文件vue
分享给朋友:

相关文章

vue实现拼音搜索

vue实现拼音搜索

实现拼音搜索的基本思路 拼音搜索的核心是将中文转换为拼音,并在用户输入拼音时匹配对应的中文内容。Vue中可以通过集成拼音转换库(如pinyin或pinyin-pro)实现这一功能。 安装拼音转换库…

vue伪函数实现

vue伪函数实现

Vue 伪函数实现方法 伪函数(Mock Function)在 Vue 中常用于测试或模拟某些逻辑,以下是几种常见的实现方式: 使用 Jest 的 jest.fn() 在单元测试中,可以通过 Jes…

vue实现导航切换内容

vue实现导航切换内容

Vue实现导航切换内容的方法 在Vue中实现导航切换内容,可以通过以下方式实现: 使用动态组件 动态组件通过<component :is="currentComponent">实现内容切…

vue实现表格多行修改

vue实现表格多行修改

实现多行编辑表格 在Vue中实现表格的多行编辑功能,可以通过以下方法完成。这里以Element UI的表格组件为例,但思路适用于其他UI库或原生实现。 数据准备 定义表格数据和编辑状态管理变量:…

vue实现导航栏切图

vue实现导航栏切图

Vue 实现导航栏切图 使用 Vue Router 实现基础导航 在 Vue 项目中,可以通过 Vue Router 实现导航栏的路由切换。创建一个导航栏组件,并在其中使用 <router-li…

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双…