当前位置:首页 > VUE

vue 实现下载功能

2026-01-21 10:26:43VUE

使用 window.open 直接下载

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

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

使用 <a> 标签下载

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

vue 实现下载功能

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 后下载。

vue 实现下载功能

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实现alert

vue实现alert

实现自定义 Alert 组件 在 Vue 中可以通过组件化方式实现自定义 Alert 弹窗。以下是基于 Vue 3 的实现示例: 组件代码 (Alert.vue) <template>…

vue 实现blog

vue 实现blog

Vue 实现博客的基本步骤 使用 Vue 实现博客可以分为前端和后端两部分,前端使用 Vue.js 框架,后端可以选择 Node.js、Python 或其他服务端语言。以下是一个基于 Vue 的博客实…

vue实现token

vue实现token

Vue 中实现 Token 认证的方法 在 Vue 中实现 Token 认证通常涉及前端与后端的交互,包括 Token 的获取、存储、发送和刷新等操作。以下是具体实现步骤: 获取 Token 用户登…

vue实现文字

vue实现文字

Vue 中实现文字显示的方法 在 Vue 中实现文字显示可以通过多种方式,包括插值表达式、指令、组件等。以下是几种常见的实现方法: 插值表达式 使用双大括号 {{ }} 进行文本插值,这是 Vue…

vue实现换肤

vue实现换肤

使用 CSS 变量实现换肤 在 Vue 项目中,可以通过 CSS 变量(Custom Properties)动态切换主题色。CSS 变量可以在运行时修改,适合实现换肤功能。 定义全局 CSS 变量:…

vue实现ios

vue实现ios

Vue 实现 iOS 风格应用 使用 Vue 实现 iOS 风格的应用,可以通过结合 UI 框架和自定义样式来达成目标。以下是具体方法和步骤: 选择 iOS 风格的 UI 框架 Vue 生态中有多…