前端vue+express實(shí)現(xiàn)文件的上傳下載示例
新建server.js
yarn init -y yarn add express nodemon -D var express = require("express"); const fs = require("fs"); var path = require("path"); const multer = require("multer"); //指定路徑的 var app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: true })); // 前端解決跨域問(wèn)題 app.all("*", (req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); next(); }); // 訪問(wèn)靜態(tài)資源 app.use(express.static(path.join(__dirname))); // 文件上傳 app.post("/upload", multer({ dest: "./public" }).any(), (req, res) => { const { fieldname, originalname } = req.files[0]; // 創(chuàng)建一個(gè)新路徑 const name = fieldname.slice(0, fieldname.indexOf(".")); const newName = "public/" + name + path.parse(originalname).ext; fs.rename(req.files[0].path, newName, function (err) { if (err) { res.send({ code: 0, msg: "上傳失敗", data: [] }); } else { res.send({ code: 1, msg: "上傳成功", data: newName }); } }); }); // 文件下載 app.get('/download', function(req, res) { res.download('./public/test.xls'); }); // 圖片下載 app.get('/download/img', function(req, res) { res.download('./public/2.jpg'); }); let port = 9527; app.listen(port, () => console.log(`端口啟動(dòng): http://localhost:${port}`));
(1):前端文件上傳請(qǐng)求
第一種: form表單
<form action="http://localhost:9527/upload" method="POST" encType="multipart/form-data"> <input type="file" name="user"/> <input type="submit" /> </form>
第一種: input輸入框
<input type="file" @change="changeHandler($event)"/> changeHandler(event) { let files = event.target.files[0]; console.log("files",files) let data = new FormData(); data.append(files.name,files); console.log("data",data) axios.post("http://localhost:9527/upload",data,{ headers:{ "Content-Type":"multipart/form-data" } }).then(res =>{ console.log("res",res) }) },
(2):前端文件下載
第一種: 后端返回一個(gè)下載的鏈接地址,前端直接使用 即可
第二種: 使用二進(jìn)制流文件下載
<input type="button" value="點(diǎn)擊下載" @click="handleDownload"> handleDownload() { axios({ method: 'get', url: "http://localhost:9527/download", data: { test: "test data" }, responseType: "arraybuffer" // arraybuffer是js中提供處理二進(jìn)制的接口 }).then(response => { // 用返回二進(jìn)制數(shù)據(jù)創(chuàng)建一個(gè)Blob實(shí)例 if(!response) return; let blob = new Blob([response.data], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }) // for .xlsx files // 通過(guò)URL.createObjectURL生成文件路徑 let url = window.URL.createObjectURL(blob) console.log("url==========",url) // 創(chuàng)建a標(biāo)簽 let ele = document.createElement("a") ele.style.display = 'none' // 設(shè)置href屬性為文件路徑,download屬性可以設(shè)置文件名稱 ele.href = url ele.download = this.name // 將a標(biāo)簽添加到頁(yè)面并模擬點(diǎn)擊 document.querySelectorAll("body")[0].appendChild(ele) ele.click() // 移除a標(biāo)簽 ele.remove() }); },
(3) 附加:二進(jìn)制流圖片的下載
// 二進(jìn)制流圖片文件的下載 downLoadImg() { axios({ method: 'get', url: `http://localhost:9527/download/img`, responseType: 'arraybuffer', params: { id: 12 } }).then(res => { var src = 'data:image/jpg;base64,' + btoa(new Uint8Array(res.data).reduce((data, byte) => data + String.fromCharCode(byte), '')) // this.srcImg = src // 圖片回顯 var a = document.createElement('a') a.href = src a.download = '2.jpg' a.click() a.remove() }) }
到此這篇關(guān)于前端vue+express實(shí)現(xiàn)文件的上傳下載示例的文章就介紹到這了,更多相關(guān)vue express文件上傳下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決vue數(shù)據(jù)更新但table內(nèi)容不更新的問(wèn)題
這篇文章主要給大家介紹了vue數(shù)據(jù)更新table內(nèi)容不更新解決方法,文中有詳細(xì)的代碼示例供大家作為參考,感興趣的同學(xué)可以參考閱讀一下2023-08-08vue實(shí)現(xiàn)頁(yè)面自適應(yīng)的常用4種方法
前端頁(yè)面自適應(yīng)有很多方法可以實(shí)現(xiàn),本文小編將為大家詳細(xì)介紹四種常用的方法,并提供相應(yīng)的代碼示例,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10使用vue-touch報(bào)priority錯(cuò)誤的解決
這篇文章主要介紹了使用vue-touch報(bào)priority錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03如何在vite初始化項(xiàng)目中安裝scss以及scss的使用
今天想要給vite項(xiàng)目,添加全局的scss變量文件引用,這樣我們?cè)谑褂胹css變量和函數(shù)的時(shí)候就不需要每個(gè)組件都取引用了,下面這篇文章主要給大家介紹了關(guān)于如何在vite初始化項(xiàng)目中安裝scss以及scss使用的相關(guān)資料,需要的朋友可以參考下2022-10-10vue實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)和參數(shù)傳遞的兩種方式
這篇文章主要介紹了vue頁(yè)面跳轉(zhuǎn)和參數(shù)傳遞的兩種方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09vue.js數(shù)據(jù)綁定的方法(單向、雙向和一次性綁定)
本篇文章主要介紹了vue.js數(shù)據(jù)綁定的方法(單向、雙向和一次性綁定),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Vue $nextTick 為什么能獲取到最新Dom源碼解析
這篇文章主要為大家介紹了Vue $nextTick 為什么能獲取到最新Dom源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Vue動(dòng)畫(huà)事件詳解及過(guò)渡動(dòng)畫(huà)實(shí)例
通過(guò) Vue.js 的過(guò)渡系統(tǒng),可以在元素從 DOM 中插入或移除時(shí)自動(dòng)應(yīng)用過(guò)渡效果。Vue.js 會(huì)在適當(dāng)?shù)臅r(shí)機(jī)為你觸發(fā) CSS 過(guò)渡或動(dòng)畫(huà),你也可以提供相應(yīng)的 JavaScript 鉤子函數(shù)在過(guò)渡過(guò)程中執(zhí)行自定義的 DOM 操作2019-02-02Vue3組件異步更新和nextTick運(yùn)行機(jī)制源碼解讀
這篇文章主要為大家介紹了Vue3組件異步更新和nextTick運(yùn)行機(jī)制源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03