各位前輩好,請幫幫小弟,這程式原本快完成了,卻卡在這個地方。
這個程式主要是抓取資料後匯出Excel檔,然後顯示下載連結提供下載,按下網頁中的關閉按鈕會刪除SERVER上的Excel檔並關閉,但考量到使用者可能按下右上角的叉叉,所以在body加上onbeforeunload去觸發按下右上角叉叉後,也要刪除匯出的Excel檔。
但問題來了,加上onbeforeunload後,匯出的excel就無法打開了,
且匯出的網頁還會顯示錯誤訊息
程式碼如下:
<!--#include file="func\func.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>xxx明細表匯出</title>
</head>
<script type="text/javascript">
function closeEvent(FileStr)
{
location.href = "/test/filedel.asp?delpath="+FileStr;
}
function fileDelete(FileStr){
location.href = "/test/filedel.asp?delpath="+FileStr;
window.close();
}
</script>
<%
Dim location
date1 = Format_Time(Request("date1"),2)
date2 = Format_Time(Request("date2"),2)
If date1 = date2 Then
tablename = date1&"xxx明細表"
Else
tablename = date1&"~"&date2&"xxx明細表"
End If
FileStr = "/test/xls/"&tablename&".xlsx"
%>
<body onbeforeunload="closeEvent('<%=FileStr%>')">
<%
Set rs = Server.CreateObject("Adodb.Recordset")
sql = "SELECT * "
sql = sql + "FROM templetable "
sql = sql + "WHERE modfydate BETWEEN '"&date1&"' AND '"&date2&"' "
rs.Open sql,Sql05Conn,1,1
title = Array("aaa","bbb","ccc","ddd","eee")
Set xlApp = Server.CreateObject("Excel.Application")
Set xlWb = xlApp.Workbooks.Add
'xlApp.Visible = True '是否顯示exce程式
xlApp.DisplayAlerts = False '關閉覆蓋詢問的對話框
Set xlWs = xlWb.Worksheets(1)
xlWs.Activate
For i=0 to UBound(title)
xlWs.cells(1,i+1).value = title(i)
xlWs.cells(1,i+1).Interior.colorindex = 15 '設定欄位背景顏色
'xlWs.cells(1,i+1).horizontalalignment = 3 '欄位置中
Next
xlWs.select
xlWs.Name = tablename
xlWs.Range("A2").CopyFromRecordset rs '從A2貼上,因A1要放欄位名稱
xlWs.range("A:Z").font.size = 10 '設定字體大小
xlWs.Range("A:Z").Columns.AutoFit '自動調整欄寬
xlWb.worksheets(tablename).Select
location = Server.MapPath ("/test/xls/"&tablename&".xlsx")
xlApp.ActiveWorkbook.Saveas location '儲存檔案
xlApp.ActiveWorkbook.Close
xlApp.Application.Quit
rs.close
Set rs = Nothing
Sql05Conn.close
Set Sql05Conn = Nothing
%>
<a href="<%=FileStr%>">點我下載Excel檔</a>
<br><br>
<input type="button" name="close" value="關閉" onClick="fileDelete('<%=FileStr%>')">
</body>
</html>
請問這問題該怎麼解決呢?或者是有其他建議的方法,我也可以修改,拜託各位前輩大大了,感激不盡!
後續:
後來自行找到其他方式,在登入時建立使用者暫存資料夾,登出或timeout時刪除此資料夾,如:
Global.asa 如何取得SESSION變數值,以便登入後,可以建立使用者資料夾?
可以不要刪除 Excel 檔嗎?
另外請教一點
如果使用者在瀏覽器輸入以下網址
你的host domain/test/filedel.asp?delpath=*.*
或
你的host domain/test/filedel.asp?delpath=c:\*.*
會發生什麼事嗎?
海綿寶寶大神,我大概知道你要表達的內容是什麼,也就是以資安角度考量,不建議我這樣做對吧? 且在瀏覽器使用檢視原始碼,也就可以看到我刪除的網頁名稱filedel.asp,我剛剛也發現這是極度不安全的作法。那請問有什麼其他建議的做法嗎?謝謝!
海綿寶寶大神
參考一
這個作法一直都有在使用,但是有缺點,有時候直接開啟會打不開且出現錯誤,要下載儲存檔案才可以打開,
可以打開後又會先出現警告訊息,才可以打開
然後又會有開啟慢且檔案大的問題,所以才會使用Excel.Application的方式,來解決上述的問題。
參考二
研究了一下,看起來像是ASP.NET的語法,有try-catch我想應該不是ASP能夠識別的吧?
謝謝!
從訊息來看,有點像是檔案已經不存在。
因該是沒建立起來才對。
這點得先找一下源頭厘清一下原因。
另外,不要給user可以刪除的控制,這很危險的。
如果你怕匯出檔案太多。可以做一支內部刪除的動作也沒關係。
但千萬不要直接將刪除的操控給user。
會像「海綿寶寶」說的那樣,會很快樂的。
浩瀚星空超人,我看了海綿寶寶大神的回覆後,再去網頁右鍵查看原始檔,也發現的確會有很大的資安問題。
但是可以給予設計上的一些建議作法嗎?
我目前是想到說,可能是匯出Excel檔時,並打包成登入者帳號名稱的壓縮檔,在使用者登出後,就刪除此壓縮檔,但找不到相關範例,完全不知道怎麼改阿~ 哭哭!