欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

上传文件保存到服务器的HTTP请求及处理过程

程序员文章站 2022-07-15 12:00:59
...

HTTP request header:

上传文件保存到服务器的HTTP请求及处理过程

请求行:

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:

上传文件保存到服务器的HTTP请求及处理过程

  • 传输的是文件,包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束

扩展:

  • 消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)

上传文件保存到服务器的HTTP请求及处理过程

上传文件保存到服务器的HTTP请求及处理过程

上传文件保存到服务器的HTTP请求及处理过程

 现在可以知道,上面的name和pwd是以文本存储的,最后的文件是以binary二进制字节流存储的。

 注意:上传文件的文件体中包含了文件名和文件类型信息。

 

后台

先留给大家一个疑问:后台需不需要拿到HTTP request对象进行解析?

答:不需要!

前端传给我们数据+类型信息了,我们传统的思路是不是想通过HTTP request来获取对应信息进行解析,这时候就要说一下MultipartFile这个接口了。

上传文件保存到服务器的HTTP请求及处理过程

上传文件保存到服务器的HTTP请求及处理过程

大家可以看到什么信息?

  • 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封装好的方法将文件保存到本地。