一 文件上传
服务端: 一般服务端可以使用struts,SpringMVC(web框架都有这样的支持),struts是基于common-fileupload的,SpringMVC则基于Commons FileUpload和COS FileUpload ,它们一般都可以设置服务端使用的磁盘tmp文件或内存的大小,单个文件大小和类型的限制等。
本质上,它们都是在Servlet之上对request.getInputSteam()的内容做解析,服务器解析http post数据,仅仅是对http协议的实现,原理简单。(参考最后部分文件上传的http协议:http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2 )
客户端: 可以使用swf或者js,swf有SWFUpload插件,js有Jquery很多插件,最终都是通过http post方式提交文件。单从文件上传的功能看,服务端不关心客户端使用的是swf还是js,因为最终都是http post方式(如果要实现进度条,服务端就需要关心是否要作配合了)。
二 进度条
js实现进度条原理: 因为js无法通过浏览器获取文件传输的进度,所以需要服务端配合,服务端将进度(当前长度,总长度)存到session中,提供新接口返回此2个值;而客户端:使用Jquery的ajax轮询(comet方式:请求-Blocked(30s内),响应-请求-Blocked(30s内),响应...)进度,并显示。
swf实现进度条的原理: flash是本地的插件,上传文件时是flash把流交给浏览器,因此它知道文件的进度,它可以在发送过程中将发送的相关状态数据回传到js的函数中处理,不需要服务端做特别的配合。
另外:qq邮箱的附件上传,默认情况下就是使用swf的方式,可以看到页面有引进upload.swf文件。qq邮件发送的进度条估计也是使用swf。因为js实现进度条的方式太耗服务器资源了,一般不这么做。
参考: