vue上傳文件formData上傳的解決全流程
vue上傳文件formData上傳解決
axios實(shí)例的配置關(guān)鍵配置
FormData 上傳文件類型有變項(xiàng)目中封裝的公共方法需要更改頭部請(qǐng)求信息設(shè)置為設(shè)為 “multipart/form-data”
整體流程解決跨域上傳文件跨域上傳FormData格式等問題
vue中Dom結(jié)構(gòu)
<input type=“file” @change=“handleUpload” />
上傳圖片更改傳遞到接口事件
const handleUpload = (e) => { const service = axios.create({ baseURL: ‘/api', withCredentials: true // cors跨域要讓后臺(tái)設(shè)置cors跨域需后臺(tái)設(shè)配合 }) const params = new FormData() // 聲明formData數(shù)據(jù)類型 params.append(‘file', event.target.files[0]) params.append(‘tp', ‘partImg') service .post(‘UploadFiles/UploadImg', params, { headers: { ‘Content-Type': ‘multipart/form-data'// 修改請(qǐng)求頭 } }) .then(res => { // console.log(‘提交成功'); }) }
handleUpload需要在vue3項(xiàng)目中return
baseURL設(shè)置為api vue項(xiàng)目中創(chuàng)建vue.config文件并寫入proxy跨域代理vue2和vue3都支持
vue 批量上傳文件
業(yè)務(wù)背景:一次性批量上傳多個(gè)文件,只請(qǐng)求一次接口,則手動(dòng)提交到后臺(tái)
簡(jiǎn)單說明一個(gè)實(shí)現(xiàn)思路
- 前端vue統(tǒng)一處理多個(gè)文件保存到formData對(duì)象中,請(qǐng)求后臺(tái)接口
- 后臺(tái)接口使用HttpServletRequest 進(jìn)行接收,可轉(zhuǎn)化成MultipartHttpServletRequest對(duì)象接收前端formData對(duì)象
//前端使用的UI組件是Ant Design of Vue的upload組件 <template> <div class="clearfix"> <a-upload :multiple="true" :before-upload="beforeUpload" :list-type="listType" :file-list="fileList" @preview="handlePreview" @change="handleChange" @download="handleDownload" > <div v-if="isMore"> <a-icon type="plus" /> <div class="ant-upload-text">文件上傳</div> </div> <div v-if="!isMore && fileList.length < 1"> <a-icon type="plus" /> <div class="ant-upload-text">文件上傳</div> </div> </a-upload> <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel"> <img alt="example" style="width: 100%" :src="previewImage" /> </a-modal> </div> </template>
JS的核心代碼:
handleUpload() { ? ? ? const { fileList } = this ? ? ? if (fileList.length > 0) { ? ? ? ? var notUploaded = [] ? ? ? ? var uploaded = [] ? ? ? ? fileList.forEach((item) => { ? ? ? ? ? if (item.status && item.status === 'done') { ? ? ? ? ? ? uploaded.push(item.url) ? ? ? ? ? } else { ? ? ? ? ? ? notUploaded.push(item) ? ? ? ? ? } ? ? ? ? }) ? ? ? ? let formData = new FormData() ? ? ? ? notUploaded.forEach((file, index) => { ? ? ? ? ? //所有文件保存在formData中 ? ? ? ? ? formData.append(`file${index}`, file.originFileObj) ? ? ? ? }) ? ? ? ? console.log('formData', JSON.stringify(formData)) ? ? ? ? //請(qǐng)求批量上傳接口 ? ? ? ? batchUploadFile(formData, this.targetS).then((res) => { ? ? ? ? ? if (res.success) { ? ? ? ? ? ? console.log('res', JSON.stringify(res)) ? ? ? ? ? } else { ? ? ? ? ? ? this.$message.error('圖片上傳失敗,請(qǐng)重新上傳') ? ? ? ? ? } ? ? ? ? }) ? ? ? ? // return ? ? ? ? //this.$emit('loadImgUrl', this.loadImgUrl.join(',')) ? ? ? ? //this.fileList = [] ? ? ? } else { ? ? ? ? // 如果沒有圖片則返回空 ? ? ? ? //this.$emit('loadImgUrl', '') ? ? ? ? //this.fileList = [] ? ? ? } ? ? },
后臺(tái)代碼:
? ? @ApiOperation(value = "批量文件上傳(最多同時(shí)上傳5個(gè)文件)", notes = "批量文件上傳") ? ? @PostMapping("/batchUploadFile/{filePath}") ? ? public Result<?> batchUploadFile(@ApiParam(value = "自定義上傳文件的路徑") ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@PathVariable("filePath") String filePath, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?HttpServletRequest request) throws Exception { ? ? ? ? MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; ? ? ? ? Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); ? ? ? ? if (fileMap.isEmpty()) { ? ? ? ? ? ? return Result.error("上傳文件不能為空"); ? ? ? ? } ? ? ? ? if (fileMap.size() > 5) { ? ? ? ? ? ? return Result.error("批量上傳文件數(shù)量不能超過5個(gè)文件"); ? ? ? ? } ? ? ? ? List<Map<String, Object>> mapList = ftpUtils.batchUploadFile(fileMap, filePath); ? ? ? ? return Result.OK(mapList); ? ? }
注意:以上代碼部分功能不完全只能作為參考,重點(diǎn)是實(shí)現(xiàn)思路
1.前端是如何組裝參數(shù)
let formData = new FormData() ? ? ? ? notUploaded.forEach((file, index) => { ? ? ? ? ? //所有文件保存在formData中 ? ? ? ? ? formData.append(`file${index}`, file.originFileObj) //核心代碼 ? ? ? ? })
2.后臺(tái)使用MultipartHttpServletRequest對(duì)象進(jìn)行接受
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; ? ? ? ? Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
前端參數(shù)格式:
請(qǐng)求結(jié)果:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
el-checkbox-group?的v-model無法綁定對(duì)象數(shù)組的問題解決
elementUI官方文檔中el-checkbox-group組件綁定的都為一維數(shù)組,本文主要介紹了解決el-checkbox-group?的v-model無法綁定對(duì)象數(shù)組,感興趣的可以了解一下2023-05-05vue單文件組件lint error自動(dòng)fix與styleLint報(bào)錯(cuò)自動(dòng)fix詳解
這篇文章主要給大家介紹了關(guān)于vue單文件組件lint error自動(dòng)fix與styleLint報(bào)錯(cuò)自動(dòng)fix的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Vue解析帶html標(biāo)簽的字符串為dom的實(shí)例
今天小編就為大家分享一篇Vue解析帶html標(biāo)簽的字符串為dom的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11深入探索VueJS Scoped CSS 實(shí)現(xiàn)原理
這篇文章主要介紹了深入探索VueJS Scoped CSS 實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09element-ui表格數(shù)據(jù)轉(zhuǎn)換的示例代碼
這篇文章主要介紹了element-ui表格數(shù)據(jù)轉(zhuǎn)換的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Vue2.0實(shí)現(xiàn)簡(jiǎn)單分頁及跳轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了Vue2.0實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)分頁,及頁數(shù)的跳轉(zhuǎn)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07avue-crud多級(jí)復(fù)雜的動(dòng)態(tài)表頭的實(shí)現(xiàn)示例
Avue.js?是基于現(xiàn)有的element-ui庫進(jìn)行的二次封裝,本文主要介紹了avue-crud多級(jí)復(fù)雜的動(dòng)態(tài)表頭,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12