文件上传新的判断方式,已经在项目中使用,高性能,高效率

06-12-12 fczhaoxuehui
【主题】大文件上传的客户端判断

【关键词】Http协议,Ajax

【分类】编码实现

【提供者】赵学慧 系统设计部

【问题描述】

场景描述:

Eboss项目中有多个功能模块需要实现文件上传。

具体问题:

在文件上传过程中,如果仅仅依赖于服务器端判断,则容易出现大文件上传,导致速度过慢,浏览器操作失效。

【原因分析及解决方法】

一个重要的问题是:HTTP协议是一个无状态协议,一个请求的连接只能维持到响应消息被发送。如果在大文件上传时,文件传输不结束,则服务器端不会发回响应,所以导致浏览器操作失效。解决方案有三种:

第一种方式,利用JavaScript进行判断,如果文件过大,直接给出提示。但是此操作依赖于ActiveXObject控件,如果此控件被客户端禁止则会失效。

第二种方式,利用Servlet接收文件上传请求,在Http请求到达服务器端时,在请求中包含一个重要的信息就是整个请求的长度(request.getContentLength()),如果文件过大,则强制向客户端发回响应,此响应可以是一段JavaScript 警告提示。客户端在收到服务器响应之后,此次请求结束,然后大文件上传数据流自动结束。但是,此方法存在它的缺陷,就是服务器端的响应信息虽然强制发出,但是客户端浏览器并不能及时处理这个响应的数据流。所以还是需要等待一段时间,才能保证数据流断开。效率低于第一种,但是可用性强,因为对于客户端来说,它不用再依赖于控件。

第三种方式,利用Servlet和Ajax以及Web浏览器的特性解决此问题。利用IFrame,将其src指向文件上传的页面。完成一个Servlet,其中提供doGet()和doPost()功能。当文件上传时,触发Js操作,让其执行定时操作。Post请求发送至服务器端,由doPost()进行处理,首先判断请求的长度(request.getContentLength()),如果允许上传,则进行文件处理,同时向该请求的session中设置属性,表示该文件可以上传,否则设置某属性表示该文件不能上传。Js的定时操作,会每隔一段时间向服务器端发送Ajax请求,获取session中的属性值设置。允许文件上传时,可以给出相应的允许上传提示;当不用许文件上传时,可以将IFrame的src值进行重新设定。此时的关键效果出现,浏览器在文件中发现其他的URI时,也就是IFrame新的src值时,将会使用HTTP协议去获取新的资源,并建立一个新的连接,这将会使其一次的数据上传连接失效,文件上传数据流自动断开。此方法和依赖于控件的Js判断相比,其效率相当,同时又保证对浏览器设置没有要求。效率比第二种高很多,因为,客户端不用等待服务器的响应。

关于第三种实现方式,此处只是提供了一个解决的思路,在具体实现过程中,我们可以根据实际的需求来完成。一个关键性的问题就是要理解HTTP这种请求响应的会话方式。就目前来说,大多数的网站都没有实现这种功能,比如chinaren,sohu,sina的邮箱或者附件上传,均会出现大附件时响应失效。我们可以尝试在新的系统中使用。

【避免此类问题的建议】

    

banq
2006-12-14 16:17
有探索性,顶

zuly
2007-03-29 12:21
还有一种基于P2p的方式,代码量超级少!

楼主如果有兴趣,可以交流源码

猜你喜欢