对象中含有MultipartFile类型前后端处理
- @RequestBody 的参数只能设置为 “Content-Type: application/json”,而 MultipartFile 参数只能设置为"Content-Type:multipart/form-data",上述两种格式并不是兼容的。
- 统一Content-Type为"multipart/form-data"
- 后端结构体拆分,单独提出MultipartFile属性进行取值
- 前端单独赋值
后端(springboot)
@PostMapping("/addGoods")
public Result<?> addGoods(@RequestParam("image") MultipartFile image,HttpServletRequest request) throws IOException {
Goods goods =new Goods();
goods.setGDetails(request.getParameter("gDetails"));
···业务处理
String fileName = goods.getImage().getOriginalFilename();
}
前端(vue)
let forms = new FormData();
//该数据类型默认参数Content-Type:multipart/form-data
forms.append("image",document.querySelector('input[type=file]').files[0]);
//不可直接用getElementById
forms.append("gDetails", this.form2.gDetails);
forms.append("gName", this.form2.gName);
forms.append("gtId", this.form2.gtId);
forms.append("gStore", this.form2.gStore);
forms.append("gPriceNew", this.form2.gPriceNew);
forms.append("gPriceOld", this.form2.gPriceOld);
request
.post(
"/admin/addGoods",forms
)
.then((res) => {
if (res.code === "0") {
this.$message({
type: "success",
message: "添加成功!",
});
} else {
this.$message({
type: "error",
message: res.msg,
});
}
注:
- multipart/form-data 是基于 **post **方法来传递数据的,该格式会生成一个
boundary
字符串来分割请求头与请求体的,具体的是以一个boundary=${boundary}
来进行分割。 - form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。
- application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。
- MultipartFile工具类全部的接口方法
方法名 | 返回值 | 作用 |
---|---|---|
getContentType() | String | 在取文件MIME类型 |
getlnputStream() | InputStream | 获取文件流 |
getName() | String | 获取 form 表单中文件组件的名字 |
getOriginalFilename() | String | 获取上传文件的原名 |
getSize() | long | 获取文件的大小,单位为byte |
isEmpty() | boolean | 是否为空 |
transferTo(File dest) | void | 将数据保存到一个目标文件中 |