Java Web中经常需要用到文件上传,比较有名的组件就是Commons-Fileupload、COS、SmartUpload(几年前的记忆了,不知道还是不是……)。
前段时间做个Android需求,需要从客户端POST图片到Server(用了Commons-Fileupload),结果它死活解析不出文件来。
组装成的表单内容如下:
1 2 3 4 5 6 7 8 9 10 11 | --abcdefghijklmn
Content-Disposition: form-data; filename="name"
Content-Type: content/unknown
abc.jpg
--abcdefghijklmn
Content-Disposition: form-data; filename="yyy.jpg"
Content-Type: content/unknown
some data
--abcdefghijklmn
|
很正常的一个表单,POST到另外个Sever(用了别的文件上传组件),却能正常解析。因此问题一定是出现在Fileupload的表单解析上。于是跟做CGI的童鞋一起研究了下,把直接用Web页面POST的表单内容拿过来比较,总算发现问题了。看下面高亮的地方:more
1 2 3 4 5 6 7 8 9 10 11 | --abcdefghijklmn
Content-Disposition: form-data; filename="name"
Content-Type: content/unknown
abc.jpg
--abcdefghijklmn
Content-Disposition: form-data; filename="yyy.jpg"; name="yyy.jpg"
Content-Type: content/unknown
some data
--abcdefghijklmn--
|
发现没有,第7行的地方,多了个name,如果没有这个name,Fileupload就不认为它是个文件,真是悲催~
第11行里,Fileupload要求最后一个表单字段的分隔符是严格俺标准写的(也就是最后面要多两个横杠……),否则会认为文件没有结束,导致接收失败~
把这两处改了就正常了,诶,真是不知道说它严谨好还是死古板好了……