对于客户端
文件的上传其实也是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-data;boundary=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协议讲解,只是图方便理解而已。
关于服务端
写博文好累的,有空了再写这边的吧,不过意思跟客户端的几乎一致。