Vue實現下載文件功能,提高網站用戶體驗

在日常生活中,有時我們需要從網站下載文件,例如文檔、圖片、音頻、視頻等等。然而,傳統的下載方式需要用戶進入新頁面或彈窗進行下載,操作繁瑣並且影響用戶體驗。因此,在這篇文章中,我們將介紹如何使用Vue框架實現一種更加簡便、快捷的下載文件功能,提高用戶的瀏覽體驗。

一、使用axios實現文件下載

為了實現下載功能,我們需要使用到Vue框架中的網絡請求庫axios,下載文件的過程在後端實現,前端只需發送請求即可。具體實現過程如下:

import axios from 'axios'

export const downloadFile = function(url, params) {
  return new Promise((resolve, reject) => {
    axios.post(url, params, {
      responseType: 'blob'
    })
    .then(response => {
      // 獲取後端返回的文件名
      var fileName = response.headers['content-...

      // 通過瀏覽器下載文件
      var url = window.URL.createObjectURL(new Blob([res...))
      var link = document.createElement('a')
      link.style.display = 'none'
      link.href = url
      link.setAttribute('download', fileName)
      document.body.appendChild(link)
      link.click()
      resolve()
    })
    .catch(error => {
      reject(error)
    })
  })
}

在代碼中,我們定義了一個名為downloadFile的函數,它接收兩個參數,url表示文件下載鏈接,params為下載參數,我們可以在params參數中配置一些可選項,例如請求頭、請求體等信息,這裡不再贅述。在函數內部,我們先發送一個post請求,並且設置響應數據類型為blob(二進制流),這樣返回的數據就可以直接用於下載文件了。後端需要設置Content-Disposition響應頭信息,告訴瀏覽器要下載文件。我們可以在響應頭中自定義文件名,然後通過Blob對象創建一個URL鏈接,將鏈接賦值給一個隱藏的標籤,並指定下載文件的文件名,最後調用click()方法觸發下載即可。如果需要異步調用downloadFile函數,可以通過Promise進行封裝。

二、使用Vue組件方式封裝下載組件

既然下載文件是常見的需求,那麼我們可以將下載功能封裝為一個Vue組件,方便在項目中重複使用。我們來實現一個DownloadButton組件,它可以接收兩個屬性:URL和params,分別表示文件下載鏈接和請求參數。

<template>
  <button @click="handleDownload">下載</button>
</template>

<script>
import axios from 'axios'

export default {
  name: 'DownloadButton',
  props: {
    url: String,
    params: Object
  },
  methods: {
    handleDownload() {
      axios.post(this.url, this.params, {
        responseType: 'blob'
      }).then(response => {
        ...
      }).catch(error => {
        console.log(error)
      })
    }
  }
}
</script>

在代碼中,我們首先引入了axios庫,並在組件定義中聲明了name屬性以及props屬性,接着定義了一個名為handleDownload的函數,用於處理下載邏輯。當用戶點擊下載按鈕時,我們調用axios庫發送post請求,並將響應數據類型設置為blob(二進制流),在請求成功後,執行和上文一樣的下載邏輯即可。此時,我們已經將下載功能封裝成了一個完整的組件,可以在任意頁面使用只需傳入相應的URL和params參數即可。

三、使用Element UI提示下載進度

通常情況下,我們在下載文件時可能需要等待一段時間,這段時間可能很短,也可能很長,用戶無從得知。為了提高用戶體驗,我們可以使用Element UI框架提供的Progress組件,在下載文件時顯示下載進度,從而讓用戶感受到下載的進展。

<template>
  <div>
    <el-button type="primary" :loading="loading" @click="startDownload">下載文件</el-button>
    <el-progress v-if="downloading" :percentage="downloadProgress" show-text strokeLinecap="square" />
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'DownloadProgress',
  data() {
    return {
      loading: false,
      downloading: false,
      downloadProgress: 0,
      downloadUrl: '',
      downloadParams: {}
    }
  },
  methods: {
    startDownload() {
      this.loading = true
      axios.post(this.downloadUrl, this.downloadParams, {
        responseType: 'blob',
        onDownloadProgress: progressEvent => {
          // 更新下載進度
          this.downloadProgress = Math.floor(progressEvent.loaded / progressEvent.total * 100)
        }
      }).then(response => {
        ...
      }).catch(error => {
        console.log(error)
      })
    }
  },
  props: {
    url: String,
    params: Object
  },
  watch: {
    url(val) {
      this.downloadUrl = val
    },
    params(val) {
      this.downloadParams = val
    }
  }
}
</script>

在代碼中,我們首先在組件定義中聲明了data屬性,包含了4個屬性:loading表示按鈕是否處於loading狀態,downloading表示是否正在下載文件,downloadProgress表示下載進度,downloadUrl和downloadParams分別表示文件下載鏈接和請求參數。在模板中,我們使用了Element UI的Button組件,綁定了一個startDownload方法,在方法內調用了axios庫發送post請求,並設置響應數據類型為blob(二進制流),同時指定了onDownloadProgress回調函數,在下載過程中可以將下載進度更新給downloadProgress屬性。在下載結束後,執行和上文一樣的下載邏輯即可。最後,我們在模板中使用了Element UI的Progress組件,根據downloadProgress動態展示下載進度。通過此種方式,我們可以實現一個帶有下載進度提示的下載組件。

原創文章,作者:TIZZ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/144633.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TIZZ的頭像TIZZ
上一篇 2024-10-26 11:51
下一篇 2024-10-26 11:51

相關推薦

發表回復

登錄後才能評論