You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The encoding type application/x-www-form-urlencoded is inefficient for sending large quantities of binary data or text containing non-ASCII characters.
HTML FORM 的调整
1867 首先对 HTML 的
form
元素进行了两处改变:input
元素的type
属性增加一个file
属性input
元素增加一个accept
属性,表示允许的文件类型当使用
form
进行文件上传时,enctype
应设为multipart/form-data
。此后当对 form 进行 submit 时,会使用 form-data 的格式发送 HTTP 请求。要注意的是,当
form
元素中含有input type=file
而没有设置enctype
时,行为是未定义的。建议的实现
浏览器应该如何实现
type="file"
的input
元素RFC 中提到需要一个显示文件名的区域和一个用于选择文件的按钮。当
accept
属性存在时,文件选择器还需要约束可以选择文件类型。使用效率更高的
multipart/form-data
而不是application/x-www-form-urlencoded
额外的功能
加密与解密
multipart/form-data
不负责加解密。而有部分链路层协议会在链路层进行自动的加密与解密,有此需求的可以自行实现(或使用 HTTPS)。延迟文件上传
有时候文件上传不一定需要,服务器可能需要先验证其余字段是否有效,然后才允许进行文件的上传。对此需求 RFC 的建议是拆分成多个
form
进行提交,将文件上传的协议保持简单。使
input
元素过重?对使用
input
元素实现文件上传,RFC 中认为不会使其职责过重,反而迁移和兼容更易实现。上传外部文件
使用
message/external-body
并设置access-type: uri:xxxx
可以上传第三方的文件。但这个用得不多,而且没有实际操作过。(别人也不会轻轻松松让你拿到文件的 uri 地址啊。。)
multipart/form-data 定义
RFC 中的例子一:
每个
form
表单元素由boundary
进行分隔提交。每个属性都有content-disposition
和name
属性,对文件,还有表示原始文件名的filename
属性。默认表单元素的
Content-type
为text/plain
;文件为application/octet-stream
或可自动检测到的类型;多个文件时为multipart/mixed
(见下面例子)。当上传多个文件时,RFC 给出的例子二:
文件的
Content-type
属性被设置为multipart/mixed
,并启用了一个新的boundary
(相当于是一个嵌套形式)。每个文件使用新的boundary
分隔,content-disposition
被设为attachment
.content-transfer-encoding
被设置为binary
,指明该文件以二进制编码。The text was updated successfully, but these errors were encountered: