文件上传之Content-Type
大约 2 分钟
1、Content-Type介绍
Content-Type是指http/https发送信息至服务器时的内容编码类型,contentType用于表明发送数据流的类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据。
在网络请求中,常见的Content-Type有:
1.1、常见的页面资源类型
text/html,text/plain,text/css,text/javascript,image/jpeg,image/png,image/gif等;
常见的页面提交或上传文件类型
application/x-www-form-urlencoded,multipart/form-data,application/json,application/xml等。
1.2、form表单可以定义enctype属性,该属性是发送到服务器之前应该如何对表单数据进行编码
(1)默认为application/x-www-form-urlencoded编码(包含POST和GET)
其中:数据会变成key1=value1&key2=value2的形式;
有特殊字符需要utf-8;
请求类型为GET时,格式化后的字符串直接拼接到url的后面;
请求类型为POST时,格式化后的字符串会放在http body的Form Data中发送。
(2)multipart/form-data
其中:使用表单上传文件时必须指定enctype属性值为multipart/form-data;
请求体被分割成多部分,每部分使用 --boundary分割(分成小部分?查其他资料)
此处为form方式文件上传后端接收demo:
@PostMapping(value="/publish")
public void formUpload(@RequestParam("programImg") CommonsMultipartFile file){
String programImgName = file.getOriginalFilename();
byte[] fileData = file.getBytes();
}
(3)application/json
和form类似,json可以比formData的数据结构更加复杂
文件上传可以把文件编码成Base64,使用键值方式上传
此处为json方式文件上传后端接收demo:
@PostMapping(value = "/upload")
public void jsonUpload(@RequestBody HashMap<String, String> requestMap) {
String fileData = requestMap.get("fileData");
String fileName = requestMap.get("fileName");
// 此处前端上传的Base64后端无法直接解开,因为它的串包含一个头,需要把头去掉。
fileData = StringUtils.split(fileData, ",")[1];
byte[] buffer = new BASE64Decoder().decodeBuffer(fileData);
}