前一阵,因为项目需要,将之前自己封装的黑莓10上的HTTP库添加了Post上传文件的接口,实现后一直也没有测试(因为之前实现过.Net上的,所以这次自信满满的觉得肯定不会有问题),今天实现在头像上传的功能时,居然一直出错,抓了半天包,修改了一上午也没找到原因,后来实在没辙时,想到了RFC文档,然后发现这次出问题又是一次自己粗心犯二导致的,所以发个博文记录一下以免以后好了伤疤又忘了疼。
... contents of file1.txt ...
关于boundary:
RFC文档上描述,A boundary is selected that does not occur in any ofthedata.意思就是选择作为boundary的数据不会出现在要上传的数据里,这一点毫无疑问,如果作为分界数据的boundary,会出现在上传的数据里,那么boundary就没有意义了~其实RCF上没有规定
boundary的格式,但是大多数实现里boundary都采用了-----配合一个随机数据的方式。
关于multipart/form-data上传方式:
其实在封装HTTPPOST上传文件的方法时,只要实现这一种即可(单个文件也可以用这种方式上传),下面上RFC上的Sample:
Content-Type: multipart/form-data, boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="field1"
Joe Blow
--AaB03x
Content-Disposition: form-data; name="pics";filename="file1.txt"
Content-Type: text/plain
--AaB03x--
文件分界这里要切记是-- +boundary(这次出的问题也是在这犯二了,居然没有在boundary前加这两个-),结束的标志是-- + boundary +--,在每一段信息描述后要跟一个\r\n再跟文件数据,文件数据后面也要跟一个\r\n,这里也是一个关键点,其他只要按照上面的Sample去实现就好了,如果Content-Type部分不想添加根据文件后缀名填充值的话,可以直接用application/octet-stream。
Content-Type对照表:
http://tool.oschina.net/commons