最近的工作中涉及到了下載機(jī)能,在做的過程中遇到了下面一些問題。這些問題都已經(jīng)解決了,但是對策肯定不是唯一,如果大家有好的對策,愿意共通研究?;蛘咴谙螺d過程中有什么其他需要注意的問題,敬請留言。
1、 下載完畢后不能夠重定向畫面。這種情況是發(fā)生在使用了frameset的畫面上。
基本現(xiàn)象:
點(diǎn)擊下載按鈕,下載執(zhí)行完畢后,再按其他的按鈕,會出現(xiàn)javascript錯誤,不能夠找到原來畫面中的控件。原因就是因?yàn)橄螺d完畢后不能夠重定向到原來的畫面。
原因及對策1:
提交的時候把提交的form的target設(shè)定為top,這樣下載完畢后,頁面能夠重定向,就不會出現(xiàn)javascript代碼語法錯誤的現(xiàn)象。同時使用這種方法能夠把下載過程中出現(xiàn)的錯誤信息顯示在原來的畫面上。此時需要注意一點(diǎn),由于提交到的是top,所以出錯返回的畫面也要是整個frame的畫面,同時還要保存原畫面用戶輸入的數(shù)據(jù),所以建議原來畫面的數(shù)據(jù)使用session來保存。
function clickButton(){
form.target = “_top”
form.submit();
}
原因及對策2:
在當(dāng)前頁面添加一個內(nèi)禎用于下載使用,提交下載的form的時候可以把target指定到內(nèi)禎上,這樣不會影響到原來畫面,原畫面可以繼續(xù)操作。不過這種方法存在著弊端:一是很難使用javascript防止多重提交。二、如果下載過程中出現(xiàn)錯誤,顯示錯誤信息比較麻煩。鑒于上述兩種弊端使用這種方法一般是提交兩次,第一次正常提交把要下載的數(shù)據(jù)準(zhǔn)備好,保證下載能夠正常進(jìn)行,對于出錯的處理也是在這一次進(jìn)行的;第二次提交是提交到內(nèi)禎,此次提交只是進(jìn)行下載直接,不考慮會出現(xiàn)錯誤。這次提交是在onload中執(zhí)行的。
<iframe name="download" style=” visibility:hidden”/>
提交的時候使用下面的javascript
function clickButton(){
form.target = “download”;
form.submit();
}
2、 不正常的下載現(xiàn)象。
現(xiàn)象1:
在windows2000操作系統(tǒng)下,有時候點(diǎn)擊下載,彈出下載對話框后點(diǎn)擊打開,會再次彈出打開對話框。
原因及對策:
這可能是IE的安全設(shè)定產(chǎn)生的問題,如果要解決這個問題,也有辦法。我在反復(fù)的試驗(yàn)中發(fā)現(xiàn),出現(xiàn)這種現(xiàn)象的時候,提交下載的form中的數(shù)據(jù)在server端被用到,此時就會出現(xiàn)彈出兩次對話框的現(xiàn)象,如果沒有form中沒有數(shù)據(jù)或者form中的數(shù)據(jù)在server端不會被使用,那么就不會有這種現(xiàn)象,所以download的form可以設(shè)定一個空的form。(如果考慮到netscape瀏覽器,form里面還要放上一個hidden控件,否則netscape下form提交不了。)這樣這種現(xiàn)象就不會出現(xiàn)了。
<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();
}
現(xiàn)象2:
在windowsXP下,有時候下載會導(dǎo)致彈出安全制御的提示條。
原因及對策:
我所遇到的這樣的問題產(chǎn)生的原因是,我是用了1中的對策2,在準(zhǔn)備完畢數(shù)據(jù)后,在onload方法中執(zhí)行了提交到內(nèi)禎的下載操作,結(jié)果出現(xiàn)了安全的提示條(頁面最上端)。對策方法就是不在onload提交下載的操作。
3、 有關(guān)下載的性能問題。
如果下載的是固定的文件一般不會有問題,我們可以通過File類的方法得到文件的長度,然后分次寫入到流就可以了。但是有時候下載的內(nèi)容可能動態(tài)組成的,比如說從數(shù)據(jù)庫檢索出來的等。在這種情況下,如果先從數(shù)據(jù)庫中檢索出所有的數(shù)據(jù),然后在把數(shù)據(jù)按照下載的格式編輯出來,最后再算出長度分次寫入到流中,性能肯定不高。為了提交性能,我們可以這樣做,一次編輯一定數(shù)目的記錄,然后就向流中寫入,這樣也是分次的寫入到流中。在這種方式下,用戶能夠盡快看到下載的對話框,減少等待時間,同時也減少了下載過程中內(nèi)存的使用量,提高了下載的性能。
上面三個問題是我在使用struts框架做下載功能時遇到的一些問題,以及自己的一些對策,供大家參考如果大家有更好的解決辦法,請賜教。