解析element-ui中upload組件傳遞文件及其他參數(shù)的問題
最近項(xiàng)目用到了vuethink,里面集成了element-ui,之前一直用的是bootstrap框架,對(duì)js也是一知半解,然后也用過vue.js,但也是學(xué)的不通透的,然后就各種入坑。
下面就分析一下我使用element-ui遇到的問題以及解決方法吧,如有不足請(qǐng)指正。
首先在element-ui的官網(wǎng)里有對(duì)upload組件的簡(jiǎn)單的介紹
<el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" :on-preview="handlePreview" :on-remove="handleRemove" :file-list="fileList"> <el-button size="small" type="primary">點(diǎn)擊上傳</el-button> <div slot="tip" class="el-upload__tip">只能上傳jpg/png文件,且不超過500kb</div> </el-upload>
其實(shí)upload就是對(duì)input type="file"做了幾層樣式封裝
一 action url
我第一個(gè)不理解的就是action中的url,我后臺(tái)使用的是PHP語言,根據(jù)我之后的理解,這個(gè)url其實(shí)就是你PHP使用的上傳的函數(shù),就和form中的action一樣,不一樣的是我找了好久也沒發(fā)現(xiàn)是否能修改默認(rèn)的post傳遞方式
二 文件接收的同時(shí),傳遞其他參數(shù)
方案一 url傳參
對(duì)PHP提供的url進(jìn)行傳參,這是最直接能想到的方式,但是因?yàn)閍ction中是post方式的,而PHP后臺(tái)我使用的restful方式的url,post方式無法實(shí)現(xiàn)傳參,我試了好幾種都沒能成功,也不知道要如何改成get方式
第一種方案只能放棄
方案二 不使用action
放棄action,在找了好多資料后發(fā)現(xiàn)可以不使用action,而是用before-upload屬性,這是一個(gè)function類型的屬性,默認(rèn)參數(shù)是當(dāng)前文件,只要能傳遞這個(gè)文件也能實(shí)現(xiàn)效果
要傳遞這個(gè)方法就需要new一個(gè)formdata對(duì)象,然后對(duì)這個(gè)對(duì)象追加key和value,類似于postman測(cè)試時(shí)那樣
具體網(wǎng)上有人給的例子,差不多如下
beforeUpload (file) { let fd = new FormData() fd.append('key', file, fileName) axios.post(url, fd. { //做一些操作 }) return false // false就是不自動(dòng)上傳,我后來試了發(fā)現(xiàn)都一樣,都不會(huì)自動(dòng)上傳 },
這個(gè)感覺可以一試,然后我理所當(dāng)然的寫了一下的方式
beforeUpload (file,id) { let fd = new FormData() fd.append('key', file, fileName) axios.post(url, fd. { data:{ id:id } }) return false // false就是不自動(dòng)上傳,我后來試了發(fā)現(xiàn)都一樣,都不會(huì)自動(dòng)上傳 },
然后我發(fā)現(xiàn)無論怎么樣我都只能傳過去id,在PHP代碼中dump(_FLIES)永遠(yuǎn)是NULL,這就非?;鸫罅?,查了好久沒有解決方法,之后發(fā)現(xiàn)我用的Content-Type應(yīng)該是multipart/form-data,而f12中調(diào)試頁面是application/json; charset=utf-8,我就覺得是不是這個(gè)的問題,于是在代碼中又加了headers
beforeUpload (file,id) { let fd = new FormData() fd.append('key', file, fileName) axios.post(url, fd. { data:{ id:id }, headers: { 'Content-Type': 'multipart/form-data' } }) return false // false就是不自動(dòng)上傳,我后來試了發(fā)現(xiàn)都一樣,都不會(huì)自動(dòng)上傳 },
這次報(bào)的錯(cuò)是axios Missing boundary in multipart/form-data,沒有邊界,很頭疼無語
后來發(fā)現(xiàn)Content-Type是自動(dòng)識(shí)別然后加邊界的,也有人說要把Content-Type定義為undefined,還是不行,只是自動(dòng)識(shí)別Content-Type,
再后來發(fā)現(xiàn)原來傳遞formdata和data不能一起傳遞,要傳遞formdata就不能有data,所以要改為
beforeUpload (file,id) { let fd = new FormData() fd.append('file', file) fd.append('id',id) axios.post(url, fd, { }) return false // false就是不自動(dòng)上傳,我后來試了發(fā)現(xiàn)都一樣,都不會(huì)自動(dòng)上傳 },
這樣就可以了
以下是我的代碼
<el-upload class="upload-demo" drag action="123" :before-upload="beforeUpload" multiple ref="newupload" :auto-upload="false" accept=".mp4,.flv,.mov" :on-change="newhandleChange" :on-success="newhandlesuccess"> <i class="el-icon-upload"></i> <div class="el-upload__text">將文件拖到此處,或<em>點(diǎn)擊上傳</em> </div> <div class="el-upload__tip" slot="tip">請(qǐng)注意您只能上傳.mp4 .flv .mov格式的視頻文件</div> </el-upload> el-button type="primary" @click="newSubmitForm()" class="yes-btn"> 確 定 </el-button> <el-button @click="resetForm('newform')"> 重 置 </el-button>
beforeUpload (file) { console.log(file) let fd = new FormData() fd.append('file', file) fd.append('groupId', this.groupId) // console.log(fd) newVideo(fd).then(res => { console.log(res) }) return true },
newSubmitForm () { this.$refs.newupload.submit() },
export function newVideo (data) { return axios({ method: 'post', url: 'http://localhost:8086/Platform1-back-end/public/admin/VideoBase/newVideo', timeout: 20000, data: data }) }
我是把a(bǔ)xios集中放在一個(gè)文件,與vue文件分離了,其實(shí)都差不多
還有就是action中隨便加一個(gè)東西會(huì)有404錯(cuò)誤,但是不影響最終效果,介意的可以看看有什么方法去除
方案三 分多次傳值
方案二成功了就沒有試,不過也沒有意義了不方便
到此這篇關(guān)于element-ui中upload組件如何傳遞文件及其他參數(shù)的文章就介紹到這了,更多相關(guān)element-ui中upload組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript原生編寫《飛機(jī)大戰(zhàn)坦克》游戲完整實(shí)例
飛機(jī)大戰(zhàn)坦克是一款小游戲,相信很多朋友都有玩過,由于最近在深入學(xué)習(xí)Javascript,所以想著用利用Javascript來實(shí)現(xiàn)這個(gè)游戲,下面這篇文章主要介紹了如何利用JavaScript原生編寫《飛機(jī)大戰(zhàn)坦克》游戲,需要的朋友可以參考下2017-01-01談?wù)凧avaScript中super(props)的重要性
今天小編就為大家分享一篇關(guān)于談?wù)凧avaScript中super(props)的重要性,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02js實(shí)現(xiàn)的點(diǎn)擊div區(qū)域外隱藏div區(qū)域
這篇文章主要介紹了通過js實(shí)現(xiàn)點(diǎn)擊div區(qū)域外隱藏div區(qū)域,原理及示例代碼如下2014-06-06JavaScript實(shí)現(xiàn)簡(jiǎn)單的日歷效果
本文給大家分享的是一個(gè)簡(jiǎn)單的JavaScript制作的日歷模板,小伙伴們可以根據(jù)自己的需求,繼續(xù)補(bǔ)充,希望大家能夠喜歡2016-09-09JavaScript定時(shí)器實(shí)現(xiàn)的原理分析
JavaScript中的定時(shí)器大家基本在平時(shí)的開發(fā)中都遇見過吧,但是又有多少人去深入的理解其中的原理呢?本文我們就來分析一下定時(shí)器的實(shí)現(xiàn)原理、定時(shí)器的妙用、定時(shí)器使用注意事項(xiàng),有興趣的朋友可以看下2016-12-12JavaScript 節(jié)點(diǎn)操作 以及DOMDocument屬性和方法
最近發(fā)現(xiàn)DOMDocument對(duì)象很重要,還有XMLHTTP也很重要 注意大小寫一定不能弄錯(cuò).2007-12-12js實(shí)現(xiàn)二級(jí)菜單點(diǎn)擊顯示當(dāng)前內(nèi)容效果
這篇文章主要介紹了js實(shí)現(xiàn)二級(jí)菜單點(diǎn)擊顯示當(dāng)前內(nèi)容效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04在element-ui的select下拉框加上滾動(dòng)加載
這篇文章主要介紹了在element-ui的select下拉框加上滾動(dòng)加載,本文以以element-ui中的select為例,給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-04-04