vue3前端獲取文件的絕對(duì)路徑問(wèn)題解決
公司的項(xiàng)目是基于vue3的,由于需求需要前端獲取用戶(hù)選的文件的絕對(duì)路徑。但是瀏覽器處于安全策略無(wú)法獲取真實(shí)的文件路徑,只能拿到相對(duì)路徑或者是D:\fakepath\xxxx.
看了網(wǎng)上很多方法都很坑,明明沒(méi)拿到路徑非說(shuō)拿到了,浪費(fèi)了很多時(shí)間,這里要說(shuō)單純依靠vue是解決不了的??!
最后選擇了引入electron來(lái)獲取文件的絕對(duì)路徑。項(xiàng)目已經(jīng)使用electron進(jìn)行了打包,所以是可以通過(guò)electron方式運(yùn)行的,現(xiàn)在需要的就是vue的代碼中引入electron,進(jìn)行打開(kāi)文件管理器,實(shí)現(xiàn)文件路徑獲取。
首先要安裝相關(guān)的包:
npm install --save-dev electron npm install --save-dev electron-builder
所有的界面代碼都是在vue項(xiàng)目中完成的所以vue中不再需要preload.js background.js這些文件
electron的通信是通過(guò)ipcRenderer實(shí)現(xiàn)的
在需要通信的文件中進(jìn)行調(diào)用
const { ipcRenderer } = require('electron')
這時(shí)候會(huì)報(bào)錯(cuò),錯(cuò)誤顯示是node_modules/electron/index.js文件中引入fs.existsSync語(yǔ)句造成的
百度查資料得知原因是:
(1)、首先在渲染進(jìn)程屬于瀏覽器端,沒(méi)有集成Node的環(huán)境,所以類(lèi)似 fs 這樣的Node的基礎(chǔ)包是不可以使用。
(2)、因?yàn)闆](méi)有Node環(huán)境,所以這種屬于node api的require關(guān)鍵詞是不可以使用的。
(3)、electron5.x的node集成環(huán)境默認(rèn)是關(guān)閉的,這之前的版本是默認(rèn)開(kāi)啟的
方案是在主進(jìn)程中集成 Nodejs,也就是添加配置nodeIntegration: true
vue.config.js配置:
pluginOptions: { electronBuilder: { nodeIntegration: true, contextIsolation: false, } }
然后通過(guò)使用window.require代替require來(lái)引入electron,因?yàn)榍罢卟粫?huì)被webpack編譯,在渲染進(jìn)程require關(guān)鍵字就是表示node模塊的系統(tǒng)渲染進(jìn)程:
const { ipcRenderer } = window.require('electron')
這時(shí)候又出現(xiàn) window.require is not a function .錯(cuò)誤,這是因?yàn)楣こ淌窃诒镜貫g覽器運(yùn)行的,識(shí)別不了electron中的api,只要保證在electron應(yīng)用程序下運(yùn)行就不會(huì)報(bào)錯(cuò)
解決:npm install --save is-electron
function importStudy() { if (isElectron()) { window.ipcRenderer = window.require('electron').ipcRenderer ipcRenderer.send('upload', "import study") ipcRenderer.on('get-file-path', (event: any, arg: any) => { console.log(arg) }) }) } }
vue文件:
<button @click="importStudy">import</button>
點(diǎn)擊頁(yè)面的按鈕就會(huì)向upload發(fā)送消息去進(jìn)行打開(kāi)文件管理的操作
在electron的包中main.js進(jìn)行接收
ipcMain.on('upload',(event,message)=>{ console.log(message) dialog.showOpenDialog({ title:'選擇要上傳的文件',//對(duì)話(huà)框的標(biāo)題 buttonLabel: '確認(rèn)', //確定按鈕的自定義標(biāo)簽 properties: [ 'openDirectory', 'multiSelections'], //打開(kāi)文件的屬性,打開(kāi)文件還是文件夾,隱藏文件,多選文件 }).then(res=>{ if(!res.canceled){ console.log(res.filePaths) event.reply('get-file-path',res.filePaths)//拿到路徑后返回 } }).catch(err=>{ console.log(err) }); })
此時(shí)importStudy可以拿到絕對(duì)路徑了,但是前端瀏覽器沒(méi)辦法調(diào)試,后端是可以獲取到的。
總結(jié)
到此這篇關(guān)于vue3前端獲取文件的絕對(duì)路徑問(wèn)題解決的文章就介紹到這了,更多相關(guān)vue3獲取文件絕對(duì)路徑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3?實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)功能(刷新保持狀態(tài))
倒計(jì)時(shí)的運(yùn)用場(chǎng)景是需要經(jīng)常用到的,但是根據(jù)業(yè)務(wù)的不同,好比手機(jī)驗(yàn)證碼或者是郵箱驗(yàn)證碼之類(lèi)的,即使用戶(hù)跳轉(zhuǎn)到其它頁(yè)面或者刷新,再次回到登錄也,驗(yàn)證碼的倒計(jì)時(shí)也得保持狀態(tài),下面通過(guò)本文給大家分享Vue3?驗(yàn)證碼倒計(jì)時(shí)功能實(shí)現(xiàn),感興趣的朋友一起看看吧2022-08-08Vue3的provide和inject實(shí)現(xiàn)多級(jí)傳遞的原理解析
Vue3中的provide和inject函數(shù)通過(guò)原型鏈實(shí)現(xiàn)數(shù)據(jù)的多級(jí)傳遞,父組件使用provide注入數(shù)據(jù),子組件和后代組件通過(guò)inject獲取這些數(shù)據(jù),在創(chuàng)建組件實(shí)例時(shí),子組件會(huì)繼承父組件的provides屬性對(duì)象,介紹Vue3的provide和inject實(shí)現(xiàn)多級(jí)傳遞的原理,需要的朋友可以參考下2024-12-12Vue中子組件不能修改父組件傳來(lái)的Prop值的原因分析
在Vue中,父子組件之間通過(guò)Prop和Event實(shí)現(xiàn)了數(shù)據(jù)的雙向綁定,但是,Vue設(shè)計(jì)者為什么不允許子組件修改父組件傳遞的Prop呢,本文就來(lái)帶大家探究為什么子組件不能修改Prop,需要的朋友可以參考下2023-06-06一篇文章搞懂Vue3中如何使用ref獲取元素節(jié)點(diǎn)
過(guò)去在Vue2中,我們采用ref來(lái)獲取標(biāo)簽的信息,用以替代傳統(tǒng) js 中的 DOM 行為,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章搞懂Vue3中如何使用ref獲取元素節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-11-11vue.js iview打包上線(xiàn)后字體圖標(biāo)不顯示解決辦法
這篇文章主要介紹了vue.js iview打包上線(xiàn)后字體圖標(biāo)不顯示解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01使用Vue-scroller頁(yè)面input框不能觸發(fā)滑動(dòng)的問(wèn)題及解決方法
這篇文章主要介紹了使用Vue-scroller頁(yè)面input框不能觸發(fā)滑動(dòng)的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Vue3.0寫(xiě)自定義指令的簡(jiǎn)單步驟記錄
Vue中除了內(nèi)置指令,也允許注冊(cè)自定義的指令,下面這篇文章主要給大家介紹了關(guān)于Vue3.0寫(xiě)自定義指令的相關(guān)資料,需要的朋友可以參考下2021-06-06