vuejs使用FormData實(shí)現(xiàn)ajax上傳圖片文件
我相信很多使用vuejs的朋友,都有采用ajax上傳圖片的需求,因?yàn)榍昂蠖朔蛛x后,我們希望都能用ajax來(lái)解決數(shù)據(jù)問題,傳統(tǒng)的表單提交會(huì)導(dǎo)致提交成功后頁(yè)面跳轉(zhuǎn),而使用ajax能夠無(wú)刷新上傳圖片等文件。
其實(shí)已經(jīng)有朋友封裝了相關(guān)的npm包,但是我想說用原生的js api來(lái)實(shí)現(xiàn),也用不了多少代碼,而且更靈活,能使用原生就盡量用原生。接下來(lái)就以一個(gè)簡(jiǎn)單的頭像上傳來(lái)說明如何使用。
效果圖
前端實(shí)現(xiàn)
<template> <div class="admin"> <div class="admin-content"> <div class="edit"> <div class="avatar"> <div class="img"> <img :src="avatar" @click="setAvatar"> <span>更改</span> </div> <input type="file" name="avatar" accept="image/gif,image/jpeg,image/jpg,image/png" style="display:none" @change="changeImage($event)" ref="avatarInput"> </div> <button type="button" @click="edit">確認(rèn)修改</button> </div> </div> </div> </template> <script> export default { data() { return { avatar: this.$store.state.administrator.avatar, } }, methods: { edit() { // 修改了頭像 if (this.$refs.avatarInput.files.length !== 0) { var image = new FormData() image.append('avatar', this.$refs.avatarInput.files[0]) this.axios.post('/avatar', image, { headers: { "Content-Type": "multipart/form-data" } }) } }) }, setAvatar() { this.$refs.avatarInput.click() }, changeImage(e) { var file = e.target.files[0] var reader = new FileReader() var that = this reader.readAsDataURL(file) reader.onload = function(e) { that.avatar = this.result } } } } </script>
解釋一下上面代碼的意思,當(dāng)我們點(diǎn)擊圖片會(huì)觸發(fā)setAvatar函數(shù),該函數(shù)會(huì)觸發(fā)input的click事件,于是就會(huì)彈出文件選擇框,當(dāng)我們選擇了一張圖片后,觸發(fā)chageImage函數(shù),這個(gè)函數(shù)的功能就是預(yù)覽你上傳的圖片,單后當(dāng)我們點(diǎn)擊修改按鈕后,就會(huì)把資源傳到后端
后端處理
后端接收到你上傳的資源,肯定要把資源保存到服務(wù)器,我就以Nodejs來(lái)說明,我使用formidable解析上傳的數(shù)據(jù)
exports.avatar = function(req, res, next) { let form = new formidable.IncomingForm() form.parse(req, function(err, fields, files) { if (err) { return res.json({ "code": 500, "message": "內(nèi)部服務(wù)器錯(cuò)誤" }) } // 獲取后綴名 let extname = path.extname(files.avatar.name) let oldpath = files.avatar.path; let newpath = './public/avatar' + extname; let avatarName = 'avatar' + extname; // 更改名字和路徑 fs.rename(oldpath, newpath, function(err) { if (err) { return res.json({ "code": 401, "message": "圖片上傳失敗" }) } }) // 更新數(shù)據(jù)庫(kù) db.updateMany('users', { "user": username }, { "avatar": avatarName }, function(err, result) { if (err) { return res.json({ "code": 401, "message": "頭像更新失敗" }) } return res.json({ "code":200, "message": "頭像上傳成功" }) }) }) }
后端解析ajax提交的數(shù)據(jù)和解析采用傳統(tǒng)表單提交的數(shù)據(jù)方法一樣,如果你是做前端開發(fā)的,不了解后端代碼影響不大。
說這么多,還是來(lái)個(gè)demo吧,https://github.com/wmui/vueblog,這個(gè)小項(xiàng)目后臺(tái)有個(gè)頭像修改的功能,是使用ajax上傳圖片的,核心代碼百行不到,前后端分離。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Vue中l(wèi)ocalstorage和sessionstorage的使用
這篇文章主要介紹了詳解Vue中l(wèi)ocalstorage和sessionstorage的使用方法和經(jīng)驗(yàn)心得,有需要的朋友跟著小編參考學(xué)習(xí)下吧。2017-12-12vue中的H5移動(dòng)端項(xiàng)目?真機(jī)測(cè)試配置方式
這篇文章主要介紹了vue中的H5移動(dòng)端項(xiàng)目?真機(jī)測(cè)試配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Vue自動(dòng)構(gòu)建發(fā)布腳本的方法示例
這篇文章主要介紹了Vue自動(dòng)構(gòu)建發(fā)布腳本的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Vue項(xiàng)目中實(shí)現(xiàn)描點(diǎn)跳轉(zhuǎn)scrollIntoView的案例
這篇文章主要介紹了Vue項(xiàng)目中實(shí)現(xiàn)描點(diǎn)跳轉(zhuǎn)scrollIntoView的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09詳解關(guān)于Vue2.0路由開啟keep-alive時(shí)需要注意的地方
這篇文章主要介紹了關(guān)于Vue2.0路由開啟keep-alive時(shí)需要注意的地方,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-09-09關(guān)于Vue?ui?的沒反應(yīng)、報(bào)錯(cuò)問題解決總結(jié)
這篇文章主要介紹了關(guān)于Vue?ui?的沒反應(yīng)、報(bào)錯(cuò)問題解決總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue實(shí)現(xiàn)給div綁定keyup的enter事件
這篇文章主要介紹了vue實(shí)現(xiàn)給div綁定keyup的enter事件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-07-07