最近的工作中涉及到了下載機能,在做的過程中遇到了下面一些問題。這些問題都已經解決了,但是對策肯定不是唯一,如果大家有好的對策,愿意共通研究。或者在下載過程中有什么其他需要注意的問題,敬請留言。
1、 下載完畢后不能夠重定向畫面。這種情況是發生在使用了frameset的畫面上。
基本現象:
點擊下載按鈕,下載執行完畢后,再按其他的按鈕,會出現javascript錯誤,不能夠找到原來畫面中的控件。原因就是因為下載完畢后不能夠重定向到原來的畫面。
原因及對策1:
提交的時候把提交的form的target設定為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端不會被使用,那么就不會有這種現象,所以download的form可以設定一個空的form。(如果考慮到netscape瀏覽器,form里面還要放上一個hidden控件,否則netscape下form提交不了。)這樣這種現象就不會出現了。
<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框架做下載功能時遇到的一些問題,以及自己的一些對策,供大家參考如果大家有更好的解決辦法,請賜教。
今天是第一次來到BlogJava這個博客網站,也是第一次正式的注冊博客,希望在這個網站里面能夠結交一些朋友,也希望自己的寫的東西對大家能夠有所幫助。