国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue文件上傳下載功能完整實現(xiàn)方案

在Web應(yīng)用開發(fā)中,文件傳輸功能是管理系統(tǒng)類項目的核心模塊之一。

本文針對Vue技術(shù)棧,深度解析文件上傳、數(shù)據(jù)下載、模板獲取三大高頻需求的一站式解決方案,提供經(jīng)過生產(chǎn)環(huán)境驗證的Element-UI組件實現(xiàn)方案。

Vue文件上傳下載功能完整實現(xiàn)方案

一、功能概述

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

  2. 數(shù)據(jù)下載:根據(jù)選擇記錄下載對應(yīng)數(shù)據(jù)

  3. 文件上傳:支持多文件上傳到服務(wù)器

二、模板下載實現(xiàn)

實現(xiàn)方案

Html:

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

JavaScript:

// 優(yōu)化建議:
// 1. 使用require保證路徑正確性
// 2. 添加錯誤處理
// 3. 統(tǒng)一文件路徑管理

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('模板下載失敗,請刷新頁面重試')
  }
}

注意事項

  • 文件存放位置應(yīng)位于項目根目錄/static/upload目錄下

  • 生產(chǎn)環(huán)境需要確保文件路徑正確

  • 建議添加文件校驗(如文件存在性檢查)

三、數(shù)據(jù)下載實現(xiàn)

Html

<el-button 
  type="primary" 
  :disabled="selectedIds.length === 0"
  @click="handleDownload">
  下載數(shù)據(jù)
</el-button>

JavaScript

// 優(yōu)化點:
// 1. 使用POST請求避免URL長度限制
// 2. 添加加載狀態(tài)
// 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' // 重要:接收二進制流
    })

    // 創(chuàng)建下載鏈接
    const url = window.URL.createObjectURL(new Blob([response.data]))
    const link = document.createElement('a')
    link.href = url
    link.setAttribute('download', '學生數(shù)據(jù).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頭

  • 建議添加文件下載進度提示

  • 大文件下載建議使用分片下載

四、文件上傳實現(xiàn)

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') // 觸發(fā)上傳成功事件
      }
    } catch (error) {
      console.error('上傳失敗:', error)
      this.$message.error(error.response?.data?.message || '上傳失敗')
    } finally {
      this.uploading = false
    }
  }
}

五、完整技術(shù)要點

路徑管理

  • 使用@指向src目錄

  • 生產(chǎn)環(huán)境需確保靜態(tài)資源正確部署

安全增強

  • 文件類型白名單校驗

  • 文件大小限制

  • Token驗證

性能優(yōu)化

  • 大文件分片上傳

  • 上傳進度顯示

  • 并發(fā)控制

錯誤處理

  • 網(wǎng)絡(luò)錯誤捕獲

  • 服務(wù)端錯誤提示

  • 異常邊界處理

用戶體驗

  • 禁用狀態(tài)反饋

  • 操作成功提示

  • 加載狀態(tài)指示

六、常見問題解決方案

  • 跨域問題:確保服務(wù)端配置CORS

  • 413錯誤:調(diào)整Nginx配置client_max_body_size

  • Token失效:添加401攔截跳轉(zhuǎn)登錄

  • 文件名亂碼:設(shè)置filename*=UTF-8''${encodeURIComponent(filename)}

  • 大文件上傳:實現(xiàn)分片上傳和斷點續(xù)傳


文章來源地址http://www.zghlxwxcb.cn/article/787.html

到此這篇關(guān)于Vue文件上傳下載功能完整實現(xiàn)方案的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/787.html

如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請聯(lián)系站長進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

    系統(tǒng)發(fā)生錯誤

    系統(tǒng)發(fā)生錯誤

    您可以選擇 [ 重試 ] [ 返回 ] 或者 [ 回到首頁 ]

    [ 錯誤信息 ]

    頁面錯誤!請稍后再試~

    Tob