Vue使用axios圖片上傳遇到的問題
FormData是個什么鬼?
經(jīng)過多方搜索調(diào)查了解,這個神奇的東西是XMLHttpRequest Level 2 新增的一個對象,于2008年2月提出,可以利用它來提交表單、模擬表單提交,當(dāng)然最大的優(yōu)勢就是可以上傳二進制文件,可以把所有表單元素的name與value組成一個queryString,提交到后臺。
劃重點: 可以把所有表單元素的name與value組成一個queryString,提交到后臺。這不就是后端所謂的轉(zhuǎn)換數(shù)據(jù)格式,按格式提交唄,前后端分離肯定是異步提交,這個就可以很好的去解決這個問題!
使用也很soeasy 只需要把 form 表單作為參數(shù)傳入 FormData 構(gòu)造函數(shù)即可!
在vue和axios的配合下實戰(zhàn)一波
<!-- *.vue組件中的上傳組件 我這里使用的是buefy的vue組件 --> <form method="post" enctype="multipart/form-data"> <b-field class="file is-primary" :class="{'has-name': !!file}"> <b-upload v-model="file" class="file-label" @input="getModifyAvatar()"> <span class="file-cta"> <b-icon class="file-icon" icon="upload"></b-icon> <span class="file-label">Click to upload</span> </span> <span class="file-name" v-if="file"> {{ file.name }} </span> </b-upload> </b-field> </form> <script> export default { data(){ return { userInfo: '', // 通過一個get請求把用戶相關(guān)信息賦值給它 file: null, } }, methods: { // 修改頭像 getModifyAvatar(){ const formData = new FormData(); // 構(gòu)造formData數(shù)據(jù) formData.append('avatar', this.file) // 提交put請求 getModifyInfo(formData).then(res => { this.userInfo.avatar = res.data.avatar }) }, } } </script>
// api.js // 這是我封裝的全局請求方法 import { request } from '../network/request' // 修改用戶頭像 export const getModifyInfo = (params) => { return request({ url: 've_register/1/', method: 'put', headers: { 'Content-Type': 'multipart/form-data' }, data: params }) }
看以上代碼,注意發(fā)送請求的時候一定要設(shè)置請求頭header,如上所示,html表單form中也需要設(shè)置下enctype="multipart/form-data" 否則也是不行的!
通過上面的例子我們目前只用到了FormData的append()方法,網(wǎng)上大部分關(guān)于 FormData 介紹的文章都只提到了append()方法,那么FormData 對象到底有些什么方法呢?其實我們console 一下就知道了:
console 之后我們有重大的發(fā)現(xiàn),F(xiàn)ormData 對象竟然有這么多方法,所以還是自己測試才能發(fā)現(xiàn)真相,下面就對這些方法一一進行講解:
append()
append()方法用于向 FormData 對象中添加鍵值對:
fd.append('key1',"value1"); fd.append('key2',"value2");
fd是 FormData 對象,可以新建的空的對象,也可以是已經(jīng)包含 form 表單或其他鍵值對。
set()
設(shè)置對應(yīng)的鍵 key 對應(yīng)的值 value(s)
fd.set('key1',"value1"); fd.set('key2',"value2");
append() 方法有點類似,這兩者的區(qū)別就是,當(dāng)指定的 key 值存在時,append()方法是將新增的添加的所有的鍵值對最后,而set()方法將會覆蓋前面的設(shè)置的鍵值對。還是通過實例來對比,我們在前面的 form 的基礎(chǔ)上 append() 或 set() 新的鍵值對:
fd.append('name',"will");
有兩個key為name的鍵值對:
以上就是 append() 和 set() 的區(qū)別。如果設(shè)置的key值不存在,那么兩者的效果是一樣的。
delete()
接收一個參數(shù),表示你要刪除的 key 值的名字,如果有多個相同 key 值,會一并刪除:
fd.append('name','will'); fd.delete('name');
form 中的 name 信息以及通過append() 新增的name 的信息都被刪除了。
get() 和 getAll()
接收一個參數(shù),表示需要查找的 key 的名稱,返回第一個該 key 對應(yīng)的 value 值。如果有多個相同的 key, 而且要返回所有的這個 key 對應(yīng)的 value 值。
同樣以上面的 form 表單為基礎(chǔ):
fd.append('name','will'); console.log(fd.get('name')); // sean
fd.append('name','will'); console.log(fd.getAll('name')); // ["sean", "will"]
has()
該方法也接收一個參數(shù),同樣是 key 的名稱,返回一個Boolean 值, 用來判斷FormData 對象是否含有該 key。以上面的form為例:
console.log(fd.has('name')); // true console.log(fd.has('Name')); // false
其他幾個就不介紹了,大家感興趣的自己去驗證下,寫一遍嗎,敲一遍,比看任何文章要來的實在喲!
如果以上文章對您有幫助,請給我們的開源項目點點star: github.crmeb.net/u/xingfu 不勝感激!
以上就是Vue使用axios圖片上傳遇到的問題的詳細(xì)內(nèi)容,更多關(guān)于Vue使用axios圖片上傳的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue3中項目優(yōu)化方法詳解(Web?Worker的使用)
最近在做vue3的項目中,遇到了計算量龐大導(dǎo)致頁面響應(yīng)緩慢的問題,所以下面這篇文章主要給大家介紹了關(guān)于vue3中項目優(yōu)化方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07利用Vue-draggable組件實現(xiàn)Vue項目中表格內(nèi)容的拖拽排序
這篇文章主要介紹了利用Vue-draggable組件實現(xiàn)Vue項目中表格內(nèi)容的拖拽排序,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06解決antd 下拉框 input [defaultValue] 的值的問題
這篇文章主要介紹了解決antd 下拉框 input [defaultValue] 的值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10詳解Vue返回值動態(tài)生成表單及提交數(shù)據(jù)的辦法
這篇文章主要為大家介紹了Vue返回值動態(tài)生成表單及提交數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12使用Vue CLI創(chuàng)建typescript項目的方法
這篇文章主要介紹了使用Vue CLI創(chuàng)建typescript項目的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08vue實現(xiàn)錨點跳轉(zhuǎn)scrollIntoView()使用案例
這篇文章主要介紹了vue實現(xiàn)錨點跳轉(zhuǎn)scrollIntoView()使用案例,文中結(jié)合實例代碼介紹了vue錨點跳轉(zhuǎn)的三種方式(頁內(nèi)跳轉(zhuǎn),跨頁跳轉(zhuǎn),函數(shù)跳轉(zhuǎn)),需要的朋友可以參考下2023-07-07