需求: 提交詳細信息的表單, 並上傳對應圖片(以下圖), 後臺接口要求表單數據和圖片須要一次上傳完成..element-ui
分析: 實際上, 每一個element-ui Upload組件都應發送一次請求, 很明顯不符合咱們的要求, 因而,咱們須要自定義上傳.api
表單上傳首先考慮FormData對象, 那麼就須要新建一個formData並在合適的時間將表單數據添加到formData中.app
首先, 考慮將表單數據在提交的時候使用FormData.append()放到FormData對象中, 文件/圖片在change的時候放入到FormData對象中.ui
使用append方法會有個問題, 若是上傳不成功, 當你再次在當前頁面提交, 你會發現表單數據從新添加了一遍, 那是由於FormData中key相同並不會覆蓋掉 以前的.this
因此這裏考慮用FormData.set(), 若是FormData不存在這個key, 則新建一條新數據, 若是存在, 則修改此條數據.spa
定義表單數據:設計
data() { return { checkForm: { customerName: '', phone: '', socialSecurityNO: '' }, formData: new FormData(), // 用來上傳的表單 // 用來顯示的圖片 cardFrontImageUrl: '', cardBackImageUrl: '' // 用來回傳的圖片 cardFrontUrl: '', cardBackUrl: '' } },
上傳code
methods: { // 選擇圖片上傳, 添加到formData中 cardFrontOnChange (file, fileList) { if (fileList.length > 0) { this.formData.set('cardFront', file.raw); } this.cardFrontImageUrl = URL.createObjectURL(file.raw); }, cardBackOnChange (file, fileList) { if (fileList.length > 0) { this.formData.set('cardBack', file.raw); } this.cardBackImageUrl = URL.createObjectURL(file.raw); }, // 提交全部信息時, 將數據添加到formData中 submit () { for (let key in this.checkForm) { if (this.checkForm[key]!=='') { this.formData.set(key, this.checkForm[key]); } }
// api.submitInfo()是封裝好的上傳方法 api.submitInfo(this.formData).then(res=> { if (res.code === 0) { // 成功後處理 } else { // 失敗後處理 } }) } }
若是後臺接口設計的是上傳的圖片不用區分key, 那麼選擇圖片添加到FormData中時, 只能用append方法, set將會覆蓋前面的, 根據實際需求選擇合適的方法就能夠了.orm