vue3前端獲取文件的絕對(duì)路徑問題解決
公司的項(xiàng)目是基于vue3的,由于需求需要前端獲取用戶選的文件的絕對(duì)路徑。但是瀏覽器處于安全策略無法獲取真實(shí)的文件路徑,只能拿到相對(duì)路徑或者是D:\fakepath\xxxx.
看了網(wǎng)上很多方法都很坑,明明沒拿到路徑非說拿到了,浪費(fèi)了很多時(shí)間,這里要說單純依靠vue是解決不了的??!
最后選擇了引入electron來獲取文件的絕對(duì)路徑。項(xiàng)目已經(jīng)使用electron進(jìn)行了打包,所以是可以通過electron方式運(yùn)行的,現(xiàn)在需要的就是vue的代碼中引入electron,進(jìn)行打開文件管理器,實(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的通信是通過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語句造成的
百度查資料得知原因是:
(1)、首先在渲染進(jìn)程屬于瀏覽器端,沒有集成Node的環(huán)境,所以類似 fs 這樣的Node的基礎(chǔ)包是不可以使用。
(2)、因?yàn)闆]有Node環(huán)境,所以這種屬于node api的require關(guān)鍵詞是不可以使用的。
(3)、electron5.x的node集成環(huán)境默認(rèn)是關(guān)閉的,這之前的版本是默認(rèn)開啟的
方案是在主進(jìn)程中集成 Nodejs,也就是添加配置nodeIntegration: true
vue.config.js配置:
pluginOptions: { electronBuilder: { nodeIntegration: true, contextIsolation: false, } }
然后通過使用window.require代替require來引入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)擊頁面的按鈕就會(huì)向upload發(fā)送消息去進(jìn)行打開文件管理的操作
在electron的包中main.js進(jìn)行接收
ipcMain.on('upload',(event,message)=>{ console.log(message) dialog.showOpenDialog({ title:'選擇要上傳的文件',//對(duì)話框的標(biāo)題 buttonLabel: '確認(rèn)', //確定按鈕的自定義標(biāo)簽 properties: [ 'openDirectory', 'multiSelections'], //打開文件的屬性,打開文件還是文件夾,隱藏文件,多選文件 }).then(res=>{ if(!res.canceled){ console.log(res.filePaths) event.reply('get-file-path',res.filePaths)//拿到路徑后返回 } }).catch(err=>{ console.log(err) }); })
此時(shí)importStudy可以拿到絕對(duì)路徑了,但是前端瀏覽器沒辦法調(diào)試,后端是可以獲取到的。
總結(jié)
到此這篇關(guān)于vue3前端獲取文件的絕對(duì)路徑問題解決的文章就介紹到這了,更多相關(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)證碼之類的,即使用戶跳轉(zhuǎn)到其它頁面或者刷新,再次回到登錄也,驗(yàn)證碼的倒計(jì)時(shí)也得保持狀態(tài),下面通過本文給大家分享Vue3?驗(yàn)證碼倒計(jì)時(shí)功能實(shí)現(xiàn),感興趣的朋友一起看看吧2022-08-08Vue3的provide和inject實(shí)現(xiàn)多級(jí)傳遞的原理解析
Vue3中的provide和inject函數(shù)通過原型鏈實(shí)現(xiàn)數(shù)據(jù)的多級(jí)傳遞,父組件使用provide注入數(shù)據(jù),子組件和后代組件通過inject獲取這些數(shù)據(jù),在創(chuàng)建組件實(shí)例時(shí),子組件會(huì)繼承父組件的provides屬性對(duì)象,介紹Vue3的provide和inject實(shí)現(xiàn)多級(jí)傳遞的原理,需要的朋友可以參考下2024-12-12一篇文章搞懂Vue3中如何使用ref獲取元素節(jié)點(diǎn)
過去在Vue2中,我們采用ref來獲取標(biāo)簽的信息,用以替代傳統(tǒng) js 中的 DOM 行為,下面這篇文章主要給大家介紹了關(guān)于如何通過一篇文章搞懂Vue3中如何使用ref獲取元素節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-11-11vue.js iview打包上線后字體圖標(biāo)不顯示解決辦法
這篇文章主要介紹了vue.js iview打包上線后字體圖標(biāo)不顯示解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01使用Vue-scroller頁面input框不能觸發(fā)滑動(dòng)的問題及解決方法
這篇文章主要介紹了使用Vue-scroller頁面input框不能觸發(fā)滑動(dòng)的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08