Commons-Fileupload组件的一些坑

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要求最后一个表单字段的分隔符是严格俺标准写的(也就是最后面要多两个横杠……),否则会认为文件没有结束,导致接收失败~

把这两处改了就正常了,诶,真是不知道说它严谨好还是死古板好了……