应用系统中经常需要有文件上传功能,一般的做法都是使用HTML的<form>和<input type="file">,或者使用第三方文件上传组件,如swfupload和uploadify。我们都知道如果向服务器提交数据,一般来说都是使用POST请求,请求数据会放在请求体中,以key1=value1&key2=value2的形式。这样的报文,服务器是很容易解析的。如果是上传文件,通过httpwatch抓包工具,我们可以发现:文件的内容也是放在post请求体中的。
我们知道,提交一个form的时候,可以同时上传文件和提交参数值。这就引出了一个问题:请求参数值和文件内容都是在post请求体中的,服务器必须要能识别报文中,哪些是参数值,哪些是文件内容?http协议是怎么解决这个问题的呢?可以查看rfc1867文档:Form-based File Upload in HTML。还有下面的2篇博客
http://www.cnblogs.com/chy710/archive/2010/02/22/1671007.html
http://blog.csdn.net/xiaojianpitt/article/details/6856536
很好的讲解了实现细节。如果了些报文细节,我们就可以使用HttpClient等开源组件,自行构建请求报文,实现文件上传。我们知道http请求是无状态的,连接保持时间不能太长。因此如何实现高效、健壮的文件上传,需要考虑很多细节,需要了解http协议的一些头部如ContentType,keep alive等机制。
实现了基本的上传功能后,一般还需要考虑大文件如何上传?如何实现断点上传?如何实现异步上传?多文件一起上传?等等。