我想为上传非常大文件的用户提供一个进度条。我做了一些阅读并实现了一个非常简单的解决方案:
-
我有一个
<form>
包含文件输入元素的元素;其
target
设置为隐藏iframe的ID。
-
在服务器端,有一些Spring魔术可以将对象附加到用户的会话中;可以从该对象查询上载的进度。
-
提交表单后,我开始使用
setInterval
它使用上述会话对象查询服务器的完成百分比。调用每隔半秒重复一次,如果上一个调用尚未完成,则跳过Ajax调用。我使用来自呼叫的数据更新
width
屏幕上的元素。当服务器调用报告上载完成时,我清除间隔计时器。
我创建了一个100兆字节的文件,并使用我的界面上传了它。这是在使用火狐3.6.3。我发现尽管上传需要20-25秒,但进度条直到最后才更新。此外,在上传完成之前,整个浏览器基本上都处于冻结状态。
我认为我的方法一定有缺陷,但是我用IE6尝试了同一个页面,当它的行为和我设计的一样时,我感到非常惊讶——进度条每半秒更新一次,整个上传只花了大约15秒,比火狐快得多。
我没有安装很多附加组件,但我尝试禁用Firebug并重新启动浏览器。这稍微提高了性能——我可能在上传过程中得到了一个额外的进度条更新——但仍然远远不能接受。
有人能告诉我怎样才能让火狐的性能达到IE6的水平吗?啊,我不敢相信我真的打了那个。
编辑:
我刚尝试在运行我的Web服务器的另一台机器上从火狐3.6.3浏览器上传一个大文件,但效果很好。呵呵。