Vue實現(xiàn)下載文件而非瀏覽器直接打開的方法
問題背景
對于一個txt文本、圖片、視頻、音頻等瀏覽器可以直接使用瀏覽器進(jìn)行預(yù)覽的文件,使用傳統(tǒng)的a標(biāo)簽加download屬性進(jìn)行下載是行不通的,會在瀏覽器直接打開,因此需要搞一個新的方式進(jìn)行下載。
實現(xiàn)流程
實現(xiàn)思路
這里使用Vue自定義指令,對文件鏈接進(jìn)行處理,將鏈接轉(zhuǎn)化為blob進(jìn)行下載,Vue2和Vue3在寫法上有所區(qū)別。
定義指令
在src目錄中,新建存放所有自定義指令的目錄directive,然后新建vdown.js并編寫指令:

Vue2寫法:
import Vue from "vue";
Vue.directive('down', {
inserted: (el, binding) => {
el.addEventListener('click', () => {
let link = document.createElement('a')
let url = binding.value
// 這里是將url轉(zhuǎn)成blob地址,
fetch(url).then(res => res.blob()).then(blob => { // 將鏈接地址字符內(nèi)容轉(zhuǎn)變成blob地址
link.href = URL.createObjectURL(blob)
console.log(link.href)
link.download = ''
document.body.appendChild(link)
link.click()
})
})
}
})Vue3寫法:
let vdown = {
mounted: (el, binding) => {
el.addEventListener('click', () => {
console.log(binding.value)
let link = document.createElement('a')
let url = binding.value
// 這里是將url轉(zhuǎn)成blob地址,
console.log(url)
fetch(url).then(res => res.blob()).then(blob => { // 將鏈接地址字符內(nèi)容轉(zhuǎn)變成blob地址
link.href = URL.createObjectURL(blob)
console.log(link.href)
link.download = ''
document.body.appendChild(link)
link.click()
})
})
}
}
export default vdown指令中使用fetch獲取文件內(nèi)容,并轉(zhuǎn)換為blob,然后通過構(gòu)造的A標(biāo)簽?zāi)M點擊進(jìn)行下載。
注冊指令
在Vue2寫法中,已經(jīng)使用Vue.directive注冊了指令,所以直接在main中引入自定義指令的腳本文件即可:
... import '@/directive/vdonw' ...
而在Vue3寫法中,定義指令的腳本中只是定義了指令的內(nèi)容而未注冊,所以需要在main中進(jìn)行注冊:
Vue3寫法:
import { createApp } from 'vue'
import App from './App.vue'
var app = createApp(App)
// 注冊指令
import vdown from '@/directive/vdown'
app.directive('down', vdown)
// 注冊結(jié)束
app.mount('#app')使用指令
在Vue文件中,直接定義下載按鈕,添加v-down指令并傳遞要下載的URL,即可完成下載:
... <a v-down="'http://127.0.0.1:8888/file.txt'">下載文件</a> ...
跨域問題
若遇到跨域問題,配置proxy代理解決即可,在vue.config.js中添加如下內(nèi)容:
module.exports = {
devServer: {
proxy: {
'/serverfile': {
target: 'http://www.xxx.com',//這里后臺的地址模擬的;應(yīng)該填寫你們真實的后臺接口
ws: true,
changOrigin: true,//允許跨域
pathRewrite: {
'^/serverfile': '/'//請求的時候使用這個api就可以
}
}
}
}
}修改下載按鈕中的連接:
... <a v-down="'/serverfile/file.txt'">下載文件</a> ...
然后點擊下載即可成功下載:

總結(jié)
到此這篇關(guān)于Vue實現(xiàn)下載文件而非瀏覽器直接打開的文章就介紹到這了,更多相關(guān)Vue下載文件非瀏覽器打開內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring-cloud-stream的手動消息確認(rèn)問題
這篇文章主要介紹了spring-cloud-stream的手動消息確認(rèn)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
利用Vue構(gòu)造器創(chuàng)建Form組件的通用解決方法
這篇文章主要給大家介紹了關(guān)于利用Vue構(gòu)造器創(chuàng)建Form組件的通用解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
vue中使用iview自定義驗證關(guān)鍵詞輸入框問題及解決方法
這篇文章主要介紹了vue中使用iview自定義驗證關(guān)鍵詞輸入框問題及解決方法,本文通過實例結(jié)合代碼的形式給大家介紹解決方法,需要的朋友可以參考下2018-03-03

