Vue+axios使用FormData方式向后端發(fā)送數(shù)據(jù)
前言
在前后端分離的項目中經(jīng)常使用到Vue+axios通過FormData的方式向后端(Java)發(fā)送表單數(shù)據(jù)(文字+圖片),但是在初次寫這個功能時,可能會遇到很多問題,本文詳細的記錄了該功能的實現(xiàn)。
一、該功能應用場景
前端向后端發(fā)送表單數(shù)據(jù)時,可能會同時發(fā)送圖片和文本,這時會有一些需要注意的小細節(jié)。
二、代碼示例
1.前端(使用的ant-design-vue,element-ui同理)
代碼如下(示例):
<template>
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item label="標題">
<a-input v-model="form.title"/>
</a-form-model-item>
<a-form-model-item label="作者">
<a-input v-model="form.author"/>
</a-form-model-item>
<a-form-model-item label="類型">
<a-radio-group v-model="form.tag">
<a-radio :style="radioStyle" :value="1">
生活
</a-radio>
<a-radio :style="radioStyle" :value="2">
學習
</a-radio>
<a-radio :style="radioStyle" :value="3">
社會
</a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="圖片資源">
//此處開啟了多選,并重寫了brforeUpload方法,為了關閉自動提交和將圖片轉換為base64編碼,同時聲明了文件列表的類型
<a-upload
:multiple="true"
:before-upload="beforeUpload"
name="file"
list-type="picture"
>
<a-button>
<a-icon type="upload"/>
上傳推文圖片
</a-button>
</a-upload>
</a-form-model-item>
<a-form-model-item label="正文">
<a-input v-model="form.content" type="textarea"/>
</a-form-model-item>
<a-form-model-item :wrapper-col="{ span: 14, offset: 4 }">
<a-button type="primary" @click="onSubmit">
提交
</a-button>
</a-form-model-item>
</a-form-model>
</template>
<script>
import axios from "axios";
export default {
data() {
return {
value: 1,
radioStyle: {
display: 'inline',
height: '30px',
lineHeight: '30px',
},
labelCol: {span: 4},
wrapperCol: {span: 14},
form: {
title: '',
author: '',
tag: '',
fileList: [],
content: ''
}
};
},
methods: {
beforeUpload(file, fileList) {
//將圖片轉換為Base64編碼
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => {
const base64 = reader.result;
this.form.fileList.push(base64)
};
console.log(this.form.fileList)
//禁止直接提交圖片
return false;
},
//提交表單
onSubmit() {
let formData = new FormData
//此處需要和后端接收的參數(shù)名相同
formData.append("form", JSON.stringify(this.form))
axios.post(
//后端接口,自行修改
" http://localhost:8081/manage/submit",
formData,
{
headers: {'Content-Type': 'multipart/form-data'}
}
).then(res => {
console.log(res.data.message)
})
},
},
};
</script>該段代碼效果圖:

2.后端
代碼如下(示例):
@RestController
@Slf4j
@RequestMapping("/manage")
@CrossOrigin
public class ManageArticleController {
@Resource
ArticleService articleService;
@PostMapping("/submit")
public SystemResult<String> uploadImages(@RequestParam("form") String form)throws Exception {
//這兒將傳入的參數(shù)轉換為對應的實體類
ArticleVo articleVo=JSON.parseObject(form,ArticleVo.class);
return SystemResult.success("上傳成功");
}
}實體類:
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
//對應的實體類
public class ArticleVo implements Serializable {
private String title;
private String author;
private int tag;
private List<String> fileList;
private String content;
}三、效果演示
前端向后端發(fā)送數(shù)據(jù),后端打印顯示

在傳入到后端后,可以自行根據(jù)需求將數(shù)據(jù)存入數(shù)據(jù)庫
四、問題總結
1.前端發(fā)送的字段名和后端實體類的字段名不一致
將前端發(fā)送的數(shù)據(jù)名稱和后端修改一致
2.跨域問題
后端接口上添加注解@CrossOrigin
3.文件上傳的限制問題
在后端做相應的文件上傳配置,比如上傳大小,或者前端也做相應的驗證。
4.不了解upload組件相關接口,導致功能無法實現(xiàn)
前往官網(wǎng)查看對應組件的api,實在看不懂的話可以按照我的配置來寫。
到此這篇關于Vue+axios使用FormData方式向后端發(fā)送數(shù)據(jù)的文章就介紹到這了,更多相關Vue axios FormData后端發(fā)送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue中使用[provide/inject]實現(xiàn)頁面reload的方法
這篇文章主要介紹了在vue中使用[provide/inject]實現(xiàn)頁面reload的方法,文中給大家提到了在vue中實現(xiàn)頁面刷新不同的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09

