在Web应用开发中,文件传输功能是管理系统类项目的核心模块之一。
本文针对Vue技术栈,深度解析文件上传、数据下载、模板获取三大高频需求的一站式解决方案,提供经过生产环境验证的Element-UI组件实现方案。
一、功能概述
模板下载:提供Excel模板文件下载
数据下载:根据选择记录下载对应数据
文件上传:支持多文件上传到服务器
二、模板下载实现
实现方案
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
文章来源地址https://www.toymoban.com/article/787.html
到此这篇关于Vue文件上传下载功能完整实现方案的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!