台灣最大程式設計社群網站
線上人數
1772
 
會員總數:246087
討論主題:189663
歡迎您免費加入會員
討論區列表 >> ASP >> 加上onbeforeunload後,匯出的Excel檔變成無法打開?
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
加上onbeforeunload後,匯出的Excel檔變成無法打開?
價值 : 60 QP  點閱數:422 回應數:18
樓主

阿山
初學者
316 32
1108 151
發送站內信

各位前輩好,請幫幫小弟,這程式原本快完成了,卻卡在這個地方。

這個程式主要是抓取資料後匯出Excel檔,然後顯示下載連結提供下載,按下網頁中的關閉按鈕會刪除SERVER上的Excel檔並關閉,但考量到使用者可能按下右上角的叉叉,所以在body加上onbeforeunload去觸發按下右上角叉叉後,也要刪除匯出的Excel檔。

但問題來了,加上onbeforeunload後,匯出的excel就無法打開了,

且匯出的網頁還會顯示錯誤訊息


程式碼如下:


請問這問題該怎麼解決呢?或者是有其他建議的方法,我也可以修改,拜託各位前輩大大了,感激不盡!

搜尋相關Tags的文章: [ excel ] , [ 資料匯出 ] , [ onbeforeunload ] , [ 關閉視窗 ] ,
本篇文章發表於2020-07-03 18:24
1樓
回應

香帥
檢舉此回應
匯出之後,client端就收到資料,要不要打開,與server沒關係,
若有三個人下載,打不開的原因可能
第一個人可能沒裝excel軟體,可能就打不開
第二個人可能下載一半就中斷,可能就打不開
第三個人可能......,可能就打不開。(例如防毒軟體...記憶體不夠....)
再來談到server端
您若用同一個pc下載,(client與server同台電腦),當您下載後儲存在同一位置,
您關掉視窗後server刪除該檔案,再來打開該檔案,因已被刪除就打不開。
建議您server刪除檔案,不必馬上刪除,避免第2個人要重新下載,還要重新等待資料庫與excel間的操作(若上萬筆的時候就還要等很久),
過一段時間後才以時間序,利用系統非巔峰時間去判斷哪些檔案已經過期可以刪除再去刪
本篇文章回覆於2020-07-04 14:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

老頑童
捐贈 VP 給 老頑童 檢舉此回應
當點擊「點我下載Excel檔」連結時,就會觸發onbeforeunload事件
所以Excel檔就被filedel.asp刪掉了
接下來當然開不了檔案

若不一定要馬上刪除的話
我會考慮在global.asa的Session_OnEnd事件去檢查檔案在不在,在的話再做刪除動作
本篇文章回覆於2020-07-07 09:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

阿山
檢舉此回應
回香帥大:

關於你說的"匯出之後,client端就收到資料",我猜應該是如下語法:

但是這個做法有缺點,有時候直接開啟會打不開且出現錯誤,要下載儲存檔案才可以打開,

可以打開後又會先出現警告訊息,才可以打開

然後又會有開啟慢且檔案大的問題,所以才會使用Excel.Application的方式,來解決上述的問題。

"避免第2個人要重新下載,還要重新等待資料庫與excel間的操作"
意思是說要判斷檔名是否存在,存在就跳過資料庫查詢那段,直接顯示下載連結?
因為都是以日期條件查詢,所以判斷檔案是否存在感覺可行。

"過一段時間後才以時間序,利用系統非巔峰時間去判斷哪些檔案已經過期可以刪除再去刪"
這段好抽象,請問有範例可以參考嗎? 感覺起來好像要另外設計一個刪除檔案程式,然後排程非巔峰時間去刪除檔案
只是這樣會變多個排程工作外,這隻刪除程式會時常需要新增刪除語法,以便刪除不同路徑所產生的Excel檔。

謝謝!
本篇文章回覆於2020-07-08 17:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

阿山
檢舉此回應
回老頑童大

原來是點了連結,就會觸發onbeforeunload事件
檔案正在下載,又被刪除,所以檔案就錯亂了啊啊啊!

那我的理解是在匯出檔案後,先將路徑存成session變數,然後在global.asa的Session_OnEnd事件,
去判斷session中的檔案是否存在,存在就刪除檔案,這樣是否正確?

只是因為我們的ASP系統有很多模組,光現在這個模組的Excel匯出程式就有4~5隻
那不就需要在不同的匯出Excel程式,命名不同的session變數,
然後Session_OnEnd事件內,就要分很多行程式去判斷不同session變數的檔案是否存在?

思緒好亂啊~ 哭哭!

本篇文章回覆於2020-07-09 12:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
不錯的參考

老頑童
捐贈 VP 給 老頑童 檢舉此回應
檔案太多就替每個Session用SessionID建一個資料夾
把該Session產生的Excel檔都放在該資料夾
Session_OnEnd時清空該資料夾就好,不用一個一個記
本篇文章回覆於2020-07-10 09:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

阿山
檢舉此回應
感謝老頑童的回覆!

但是這樣香帥大所說的"避免第2個人要重新下載,還要重新等待資料庫與excel間的操作"這個部分,是否就無法達成了呢?
也就是說其他使用者登入,就需要自己重新查詢資料,自己查詢的資料才能免重新查詢直接下載檔案?

謝謝!
本篇文章回覆於2020-07-10 11:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
這要看你資料共用性大不大來決定
若每個使用者查詢的條件都大同小異,當然可以考慮共用檔案
但要共用檔案,就要去記錄該Excel檔是在什麼查詢條件下產生的,這又是一份工
到底哪種合適,要依你的系統來評估了
若重覆性不高,產生Excel所花的時間也不長,其實可以不用考慮共用檔案的問題
本篇文章回覆於2020-07-10 11:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

阿山
檢舉此回應
其實我也不知道算不算有共通性,但條件不多就是了,如下:





若是要共通檔案,不同使用者的情況下,程式又該如何設計呢?

謝謝!
本篇文章回覆於2020-07-10 17:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

老頑童
捐贈 VP 給 老頑童 檢舉此回應
這種情況我不會考慮共用檔案
畢竟光日期區間的組合就不知道有多少種
再加上結帳金額,重覆性應該不高
除非產生一個Excel要跑很久

真要做的話,最簡單的就依照查詢條件去命名Excel檔
例:20200701_20200710_勞務明細表.xlsx
然後去檢查該檔案存不存在,存在就捉舊檔,不存在再去產生Excel
本篇文章回覆於2020-07-10 17:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

阿山
檢舉此回應
好的,我修改程式看看,有問題我在上來發問,非常感謝老頑童大協助。

本篇文章回覆於2020-07-10 17:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

阿山
檢舉此回應
老頑童大,求救求救

login.asp


Global.asa



這樣並不會成功建立使用者工號的資料夾,但若是使用

則會成功建立test資料夾,請問該如何在登入後可以建立使用者資料夾呢?


謝謝!
本篇文章回覆於2020-07-22 14:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
不錯的參考

老頑童
捐贈 VP 給 老頑童 檢舉此回應
Session_OnStart是在Session創立時觸發
此時session("EMPLOYEECODE") 一定還沒有值

建議在儲存檔案時再去創建資料夾即可
不然若使用者根本沒有要下載檔案,這些資料夾就白建了

另,Application是所有人共用的
將路徑存在Application可能要考慮互相覆蓋的問題
本篇文章回覆於2020-07-23 10:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

阿山
檢舉此回應
回老頑童大

由於匯出檔案的程式還蠻多的,為了避免每隻程式都還要去新增"建立資料夾"的程式碼,
所以才會考慮再登入時做建立,然後登出時刪除,這樣只要做一次建立資料夾即可。
這樣雖然看似OK,但登入逾時也需要刪除暫存資料夾的部分,我還是沒有解決。

今天再度研究Global.asa,還是失敗


我手動新增一個"1"資料夾,測試登出後只有刪除使用者資料夾,"1"資料夾卻都還在,但有時又會不明原因自己消失。
然後把IIS的連線逾時改為60秒,Session.Timeout=1,等了至少有5分鐘,結果Seesion也都還在,
於是直接按登出,"1"資料夾也還是在。

然後有其他網友說,並不能精確的控制Session_OnStart及Session_OnEnd的時機,
一般登入逾時是不會做什麼動作,或者也可以在登入後,先刪除舊的暫存資料夾在新增新的,
再有其他網友說,ASP的Session機制很不穩定,Session_OnEnd有時可能不會跑到,
還是需要固定時間手動去刪除使用者資料夾。

請問老頑童大我是不是哪裡做錯了?還是我可以採用其他網友的建議呢?
謝謝!


本篇文章回覆於2020-08-13 17:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

阿山
檢舉此回應
因看到Session_OnEnd不能使用Server.Mappath,修改Fdr的變數值

也還是沒有作用,= =
本篇文章回覆於2020-08-13 18:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
因你是手動建立,可能IUSR沒有該資料夾的刪除權限
把該資料夾加入everyone的完全控制權限再試試看
本篇文章回覆於2020-08-14 14:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.