为什么上传文件的表单里要加个属性 enctype

为什么上传文件的表单里要加个属性 enctype,第1张

表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用燃滚于文件上握芹传段段毕;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的 *** 作.

 此塌携 FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”。

森伏这种编码方式在表单发送之前都会将内容进行urlencode 编码。(空格转换为“+”,特殊字符转化为ASCII的HEX值)。

比如我们在表单域中的

firstname填入 bb ,,

最后发送之前得到的结果就是: bb+%2C%2C

然而,在向服务器发送大量的文本、包含非ASCII字符的文本衫芦或二进制数据时这种编码方式效率很低。

在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。

浏览器端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。

文件的上传其实也是post方式进行提交的,可以理解为跟表单提交大体一致,但:

1、普通贺搜表单采用的是默认MIME编码。默认值为:application/x-www-form-urlencoded(在发送前编码所有字符);

2、文件上传的表单采用的MIME编码方式必须指定为:multipart/form-data(不对字符编谈敬码。在使用包含文件上传控件的表单时,必须使用该值。);

3、在HTML表单里通过设置:encType来指定MIME编码;比如:encType="multipart/form-data",在其他客户端采用Content-Type来指定;比如:Content-Type="multipart/form-data"

说明:一个HTTP请求其实发送了2大部分内容,大家常见的就是Request Payload,但是另一个大家不常 *** 作的是Requst Header,简单来说就是:header+body的方式。上面的MIME编码等指定方式就是在header里。当然,HTML那个encType就是Content-Type,只是他换了个名字而已。当然,Content-Type何止这2种。。。太多了, 详见

4、文件上传还需要一个boundary。

说明:这个是用来干嘛的?先说位置,它是放在Content-Type里。例子:Content-Type="multipart/form-databoundary=ed67c97e-2000-47de-9033-77aeb8df43d9"(浏览器每次都会自动生成一个不同的boundary)。我们再来看看这玩意儿是用来干嘛的:它标志着一段数据(当有多个上传内容时)的开始和结束。看完了这句话我估计你跟我一样----毛意思????

a)这一串字符其实就是随机生成的,它是一个含拍慎分隔符,一定要确保你需要上传的文件中没有完全包含这个分隔符,一般来说,随便一个含几个字符的字符串都是没有问题的。

b)这个分割符到底是用来分割啥的?它用来分割你表单里各个表单元素。比如你的表单里有<input type='text' name='username' value="parcool">

<input type='file' name='filename' value="filedata">

就是用来分割这个的。

当然,Header也不止这点儿东西啊,还有一些其他的, 详见(维基百科的,不知道你能否打开)

这样,你就能愉快的上传咯,在做安卓或iOS的时候,很多框架已有类似于浏览器的功能会自动加上boundary。当然,我这里没有详细示例,也没有最底层的HTTP协议讲解,只是图方便理解而已。

写博文好累的,有空了再写这边的吧,不过意思跟客户端的几乎一致。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12290943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存