最近的工作中涉及到了下载机能,在做的过程中遇到了下面一些问题。这些问题都已经解决了,但是对策肯定不是唯一,如果大家有好的对策,愿意共通研究。或者在下载过程中有什么其他需要注意的问题,敬请留言。

 

1、  下载完毕后不能够重定向画面。这种情况是发生在使用了frameset的画面上。

基本现象:
点击下载按钮,下载执行完毕后,再按其他的按钮,会出现javascript错误,不能够找到原来画面中的控件。原因就是因为下载完毕后不能够重定向到原来的画面。

原因及对策1
提交的时候把提交的formtarget设定为top,这样下载完毕后,页面能够重定向,就不会出现javascript代码语法错误的现象。同时使用这种方法能够把下载过程中出现的错误信息显示在原来的画面上。此时需要注意一点,由于提交到的是top,所以出错返回的画面也要是整个frame的画面,同时还要保存原画面用户输入的数据,所以建议原来画面的数据使用session来保存。
function clickButton(){
    form.target = “_top”
    form.submit();
}

原因及对策2
在当前页面添加一个内祯用于下载使用,提交下载的form的时候可以把target指定到内祯上,这样不会影响到原来画面,原画面可以继续操作。不过这种方法存在着弊端:一是很难使用javascript防止多重提交。二、如果下载过程中出现错误,显示错误信息比较麻烦。鉴于上述两种弊端使用这种方法一般是提交两次,第一次正常提交把要下载的数据准备好,保证下载能够正常进行,对于出错的处理也是在这一次进行的;第二次提交是提交到内祯,此次提交只是进行下载直接,不考虑会出现错误。这次提交是在onload中执行的。
  <iframe name="download" style=” visibility:hidden”/>
提交的时候使用下面的javascript
function clickButton(){
    form.target = “download”;
    form.submit();
}

2、  不正常的下载现象。
现象1
windows2000操作系统下,有时候点击下载,弹出下载对话框后点击打开,会再次弹出打开对话框。

原因及对策:
这可能是IE的安全设定产生的问题,如果要解决这个问题,也有办法。我在反复的试验中发现,出现这种现象的时候,提交下载的form中的数据在server端被用到,此时就会出现弹出两次对话框的现象,如果没有form中没有数据或者form中的数据在server端不会被使用,那么就不会有这种现象,所以downloadform可以设定一个空的form。(如果考虑到netscape浏览器,form里面还要放上一个hidden控件,否则netscapeform提交不了。)这样这种现象就不会出现了。
<form name=”mainForm”>
   <input type=”button” name=”download” onclick=”clickButton()”>
</form>
<form name=”downLoadForm”>
   <input type=”hidden” name=”noUsed” />
</form>
使用的javascript如下:
function clickButton(){
   downLoadForm.submit();
}

现象2
windowsXP下,有时候下载会导致弹出安全制御的提示条。

原因及对策:
我所遇到的这样的问题产生的原因是,我是用了1中的对策2,在准备完毕数据后,在onload方法中执行了提交到内祯的下载操作,结果出现了安全的提示条(页面最上端)。对策方法就是不在onload提交下载的操作。

 

3、  有关下载的性能问题。

如果下载的是固定的文件一般不会有问题,我们可以通过File类的方法得到文件的长度,然后分次写入到流就可以了。但是有时候下载的内容可能动态组成的,比如说从数据库检索出来的等。在这种情况下,如果先从数据库中检索出所有的数据,然后在把数据按照下载的格式编辑出来,最后再算出长度分次写入到流中,性能肯定不高。为了提交性能,我们可以这样做,一次编辑一定数目的记录,然后就向流中写入,这样也是分次的写入到流中。在这种方式下,用户能够尽快看到下载的对话框,减少等待时间,同时也减少了下载过程中内存的使用量,提高了下载的性能。

 

上面三个问题是我在使用struts框架做下载功能时遇到的一些问题,以及自己的一些对策,供大家参考如果大家有更好的解决办法,请赐教。

posted on 2005-11-26 12:43 寻觅 阅读(393) 评论(0)  编辑  收藏 所属分类: web开发

只有注册用户登录后才能发表评论。


网站导航:
 

统计