上传文件保存到服务器的HTTP请求及处理过程
程序员文章站
2022-07-15 12:00:59
...
HTTP request header:
请求行:
POST /upload HTTP/1.1
- 因为是上传的文件, 文件大小不定,所以我们一般会使用POST请求进行文件上传
- 请求URL
- HTTP协议
请求头:
其他的都平淡无奇,主要是看上面被标注的项
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarysyCsUaLV5WrP69tB
- Content-Type 里指明了数据是以 mutipart/form-data 来编码
- 生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂
HTTP request body:
- 传输的是文件,包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束
扩展:
- 消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)
现在可以知道,上面的name和pwd是以文本存储的,最后的文件是以binary二进制字节流存储的。
注意:上传文件的文件体中包含了文件名和文件类型信息。
后台
先留给大家一个疑问:后台需不需要拿到HTTP request对象进行解析?
答:不需要!
前端传给我们数据+类型信息了,我们传统的思路是不是想通过HTTP request来获取对应信息进行解析,这时候就要说一下MultipartFile这个接口了。
大家可以看到什么信息?
- MultipartFile是一个接口并继承了InputStreamSource接口。
看到了没,MultipartFile都给我们封装好了,通过MultipartFile我们就能拿到文件的所有信息,并且还可以通过transferTo很方便的将文件输出到传入的dest file中去,这就为我们将数据保存到本地提供了极大便利!!!
// 获取原始文件名
String originalFilename = file.getOriginalFilename();
// 保存时使用的文件名
filename = UUID.randomUUID().toString();
file_info = originalFilename.split("\\.");
// 获得索引
suffix = file_info[file_info.length-1];
// 文件保存路径
parent = new File(path + suffix);
if(!parent.exists()){
parent.mkdirs();
}
File dest = new File(parent, filename + "." + suffix);
// 数据传输
file.transferTo(dest);
通过MultipartFile我们很方便的就实现了相关类型文件的保存!
总结:前端上传文件,发送post请求,文件以二进制字节流传输,后台拿到MultipartFile文件,通过MultipartFile封装好的方法将文件保存到本地。