Part

multipart/form-data 由许多块part组成,每一块之间由boundary分隔开

每一块都有自己的header

Content-Disposition: form-data; name="user"
//or
Content-Disposition: form-data; name="user"; filenmae="image.png"

每一块都可以有一个可选的Content-Type字段,默认为text/plain,如果是文件类型,而且不知道其MIME,那么应该设置为application/octet-stream

Content-Type: image/png

每一块的header和body之间都会有一个空行

每一行的结尾都应该用CRLF\r\n

Tips

  • 前端发来的filename不应该信任
  • name应该独一无二
  • namefilename都需要Percent-Encoding,应该避免Non-ASCII

boundary

boundary 应该放在Content-Type

Content-Type: multipart/form-data; boundary=abcedfghijk

每个part之间的分隔线由--boundaryCRLF组成,每个part之前都需要放置一个。最后一个分割线需要加上--后缀。比如

--abced
Content-Disposition: form-data; name="user"

uservalue
--abced
Content-Disposition: form-data; name="file"; filenmae="image.png"
Content-Type: image/png

�PNG
ffffff
--abced--

背景知识

  • Percent-Encoding,也叫做URL Encoding。https://en.wikipedia.org/wiki/Percent-encoding