当前位置:首页 > VUE

vue 实现文件下载

2026-01-18 08:32:06VUE

使用 window.open 方法

通过 window.open 直接打开文件链接触发下载,适用于已知文件 URL 的情况:

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

使用 <a> 标签动态创建下载链接

动态生成 <a> 标签并模拟点击,适用于需要从后端获取下载链接的场景:

const link = document.createElement('a')
link.href = '文件URL'
link.download = '文件名.扩展名' // 设置下载文件名
document.body.appendChild(link)
link.click()
document.body.removeChild(link)

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

当需要下载后端返回的二进制流数据时(如 Axios 请求):

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 = '文件名.扩展名'
  document.body.appendChild(link)
  link.click()
  window.URL.revokeObjectURL(url)
  document.body.removeChild(link)
})

使用 FileSaver.js 库

对于需要更复杂下载需求的场景,可以使用第三方库 FileSaver.js:

npm install file-saver
import { saveAs } from 'file-saver'

// 保存文本
saveAs(new Blob(['文件内容'], { type: 'text/plain' }), 'filename.txt')

// 保存Blob对象
saveAs(blobObject, 'filename.ext')

处理大文件分片下载

对于大文件下载,可以结合后端实现分片下载:

vue 实现文件下载

async function downloadLargeFile(url, fileName) {
  const response = await fetch(url)
  const reader = response.body.getReader()
  const contentLength = +response.headers.get('Content-Length')
  let receivedLength = 0
  const chunks = []

  while(true) {
    const { done, value } = await reader.read()
    if (done) break
    chunks.push(value)
    receivedLength += value.length
    console.log(`下载进度: ${(receivedLength / contentLength * 100).toFixed(2)}%`)
  }

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

注意事项

  • 跨域问题需确保服务器配置正确的 CORS 头
  • 动态生成的下载链接需要及时清理内存
  • 对于敏感文件建议增加权限验证
  • 移动端浏览器可能有不同的下载行为

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

相关文章

vue表单实现搜索

vue表单实现搜索

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

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 在Vue中实现菜单功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-for动态生成菜单 通过数据驱动的方式动态渲染菜单项,适合菜单内容可能变化的场景: <t…

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…

vue实现颜色闪烁

vue实现颜色闪烁

实现颜色闪烁的方法 在Vue中实现颜色闪烁效果可以通过CSS动画或JavaScript定时器动态修改样式。以下是两种常见的实现方式: 使用CSS动画实现 通过定义@keyframes动画规则…