Vue文件上传下载功能完整实现方案

在Web应用开发中,文件传输功能是管理系统类项目的核心模块之一。

本文针对Vue技术栈,深度解析文件上传、数据下载、模板获取三大高频需求的一站式解决方案,提供经过生产环境验证的Element-UI组件实现方案。

Vue文件上传下载功能完整实现方案

一、功能概述

  1. 模板下载:提供Excel模板文件下载

  2. 数据下载:根据选择记录下载对应数据

  3. 文件上传:支持多文件上传到服务器

二、模板下载实现

实现方案

Html:

<el-button type="warning" @click="downloadTemplate">下载Excel模板</el-button>

JavaScript:

// 优化建议:
// 1. 使用require保证路径正确性
// 2. 添加错误处理
// 3. 统一文件路径管理

downloadTemplate() {
  try {
    const link = document.createElement('a')
    const fileName = '学生信息模板.xls'
    
    // 推荐使用绝对路径
    link.href = require('@/static/upload/' + fileName)
    link.download = '学生信息模板.xls'
    
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    
    this.$message.success('模板下载成功')
  } catch (error) {
    console.error('模板下载失败:', error)
    this.$message.error('模板下载失败,请刷新页面重试')
  }
}

注意事项

  • 文件存放位置应位于项目根目录/static/upload目录下

  • 生产环境需要确保文件路径正确

  • 建议添加文件校验(如文件存在性检查)

三、数据下载实现

Html

<el-button 
  type="primary" 
  :disabled="selectedIds.length === 0"
  @click="handleDownload">
  下载数据
</el-button>

JavaScript

// 优化点:
// 1. 使用POST请求避免URL长度限制
// 2. 添加加载状态
// 3. 更完善的错误处理

async handleDownload() {
  if (this.selectedIds.length === 0) {
    this.$message.warning('请至少选择一条记录')
    return
  }

  try {
    this.loading = true
    const params = {
      ids: this.selectedIds
    }

    const response = await this.$axios.post('/api/download', params, {
      responseType: 'blob' // 重要:接收二进制流
    })

    // 创建下载链接
    const url = window.URL.createObjectURL(new Blob([response.data]))
    const link = document.createElement('a')
    link.href = url
    link.setAttribute('download', '学生数据.xlsx')
    document.body.appendChild(link)
    link.click()
    
    // 清理资源
    window.URL.revokeObjectURL(url)
    document.body.removeChild(link)
    
    this.$message.success('文件下载成功')
  } catch (error) {
    console.error('下载失败:', error)
    this.$message.error(error.response?.data?.message || '下载失败')
  } finally {
    this.loading = false
  }
}

注意事项

  • 后端需要返回正确的Content-Disposition头

  • 建议添加文件下载进度提示

  • 大文件下载建议使用分片下载

四、文件上传实现

Html

<el-dialog 
  title="文件上传" 
  :visible.sync="uploadDialogVisible"
  width="600px">
  <el-upload
    ref="uploader"
    :action="uploadApi"
    :headers="uploadHeaders"
    :multiple="true"
    :limit="10"
    :file-list="fileList"
    :auto-upload="false"
    :on-change="handleFileChange"
    :before-remove="handleBeforeRemove"
    accept=".xlsx,.xls,.doc,.docx,.pdf,.jpg,.png">
    
    <el-button size="small" type="primary">选择文件</el-button>
    <div slot="tip" class="el-upload__tip">
      支持扩展名:.xls/.xlsx/.doc/.pdf等格式,单个文件不超过50M
    </div>
  </el-upload>
  
  <div slot="footer" class="dialog-footer">
    <el-button @click="uploadDialogVisible = false">取消</el-button>
    <el-button 
      type="primary"
      :loading="uploading"
      @click="submitUpload">
      确认上传
    </el-button>
  </div>
</el-dialog>

JavaScript

data() {
  return {
    uploadDialogVisible: false,
    uploading: false,
    fileList: [],
    uploadApi: process.env.VUE_APP_BASE_API + '/api/upload',
    uploadHeaders: {
      'Authorization': 'Bearer ' + localStorage.getItem('token')
    }
  }
},

methods: {
  handleFileChange(file, newFileList) {
    // 文件类型校验
    const validTypes = ['xlsx', 'xls', 'doc', 'docx', 'pdf', 'jpg', 'png']
    const fileExtension = file.name.split('.').pop().toLowerCase()
    
    if (!validTypes.includes(fileExtension)) {
      this.$message.error('文件格式不支持')
      return false
    }
    
    // 文件大小限制(50MB)
    if (file.size > 50 * 1024 * 1024) {
      this.$message.error('文件大小不能超过50MB')
      return false
    }
    
    this.fileList = newFileList
  },

  handleBeforeRemove(file) {
    return this.$confirm(`确定移除 ${file.name}?`)
  },

  async submitUpload() {
    if (this.fileList.length === 0) {
      this.$message.warning('请先选择文件')
      return
    }

    try {
      this.uploading = true
      
      const formData = new FormData()
      this.fileList.forEach(file => {
        formData.append('files', file.raw)
      })

      const response = await this.$axios.post(this.uploadApi, formData, {
        headers: {
          'Content-Type': 'multipart/form-data',
          ...this.uploadHeaders
        }
      })

      if (response.data.code === 200) {
        this.$refs.uploader.clearFiles()
        this.uploadDialogVisible = false
        this.$message.success('上传成功')
        this.$emit('upload-success') // 触发上传成功事件
      }
    } catch (error) {
      console.error('上传失败:', error)
      this.$message.error(error.response?.data?.message || '上传失败')
    } finally {
      this.uploading = false
    }
  }
}

五、完整技术要点

路径管理

  • 使用@指向src目录

  • 生产环境需确保静态资源正确部署

安全增强

  • 文件类型白名单校验

  • 文件大小限制

  • Token验证

性能优化

  • 大文件分片上传

  • 上传进度显示

  • 并发控制

错误处理

  • 网络错误捕获

  • 服务端错误提示

  • 异常边界处理

用户体验

  • 禁用状态反馈

  • 操作成功提示

  • 加载状态指示

六、常见问题解决方案

  • 跨域问题:确保服务端配置CORS

  • 413错误:调整Nginx配置client_max_body_size

  • Token失效:添加401拦截跳转登录

  • 文件名乱码:设置filename*=UTF-8''${encodeURIComponent(filename)}

  • 大文件上传:实现分片上传和断点续传


文章来源地址https://www.toymoban.com/article/787.html

到此这篇关于Vue文件上传下载功能完整实现方案的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/article/787.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringBoot整合hdfs,实现文件上传下载删除与批量删除,以及vue前端发送请求,实现前后端交互功能;

    SpringBoot整合hdfs,实现文件上传下载删除与批量删除,以及vue前端发送请求,实现前后端交互功能;

    部分工具类代码参考文章:https://blog.csdn.net/qq_27242695/article/details/119683823 前端实现效果 HDFSController HDFS FileInterface (文件接口) HDFS FileImplService (文件接口实现类) HDFSConfig(从yaml读取文件) HDFSUTils 前端vue代码:

    2024年02月16日
    浏览(11)
  • 前后端分离架构文件上传与下载(含Vue + Spring完整代码)

    本文采用前后端分离式的架构,其中涉及到文件下载的需求,文件下载在任何系统中都是比较常见的。对于前后端分离架构的文件下载与往常的写法有些许不同(试过直接使用a标签,href填上下载地址,发现行不通),所以经过查找与尝试,以下文件下载前后端实现流程供大家参

    2024年02月15日
    浏览(9)
  • Vue2-文件上传、下载场景功能

    在项目开发中,上传文件的应用场景非常的多,一般情况下,上传的接口都是由公司内部自己开发一套适用于任何场景都可以使用的接口,但是这意味着该接口所涉及到的工作量与技术点就非常的多,且不稳定。于是大公司选择了前者自己研发,小公司则选择了性价比更高的

    2024年02月07日
    浏览(6)
  • 基于SpringBoot实现文件上传和下载(详细讲解And附完整代码)

    目录 一、基于SpringBoot实现文件上传和下载基于理论 二、详细操作步骤 文件上传步骤: 文件下载步骤: 三、前后端交互原理解释  四、小结  博主介绍:✌专注于前后端领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯

    2024年04月11日
    浏览(8)
  • 【SpringMVC】| 使用SpringMVC实现文件上传 | 下载功能

    【SpringMVC】| 使用SpringMVC实现文件上传 | 下载功能

    SpringMVC是一个Web框架,提供了许多有用的功能,包括文件上传和下载。通过SpringMVC上传和下载文件,您可以允许用户上传文件,以便将它们存储在服务器上,或者允许用户从服务器上下载文件。这些都可以为您的应用程序添加有用的功能,例如: 允许用户上传和共享文件 -

    2024年02月02日
    浏览(6)
  • vue3+element 分片上传 分片下载功能实现

    vue3+element 分片上传 分片下载功能实现

    思路:分片上传是把一个大文件切割若干等份,前端循环调用上传接口进行上传。分片下载也是一样的道理,前端调用接口拿到文件总大小,计算分割成多少份,循环调用下载接口获取每一段的文件流,获取全部文件片段,进行合并下载。 一、安装依赖 用于获取文件的唯一

    2024年02月10日
    浏览(7)
  • Java Web 实现文件上传和下载接口功能

    Java Web 实现文件上传和下载接口功能

    上传用post或者get请求都可以,这里代码中用post做的示例。 文件下载除了静态访问(及nginx、tomcat等服务器映射到后的文件web路径)下载以外 ,还可以通过流的方式下载,代码如下: 上传用post或者get请求都可以,这里代码中用post做的示例。  ForbiddenException 访问权限异常类

    2024年02月11日
    浏览(10)
  • 使用nio代替传统流实现文件上传和下载功能

    1.文件下载 2.文件上传

    2024年02月13日
    浏览(6)
  • vue+element ui 实现文件上传下载

    2024年02月14日
    浏览(6)
  • 一张图带你学会入门级别的SpringBoot实现文件上传、下载功能

    一张图带你学会入门级别的SpringBoot实现文件上传、下载功能

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 标题 一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码) 一张思维导图带你学会Springboot创

    2024年02月12日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包