iT邦幫忙

0

[解決][ASP] 加上onbeforeunload後,匯出的Excel檔變成無法打開?

  • 分享至 

  • xImage

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

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

但問題來了,加上onbeforeunload後,匯出的excel就無法打開了,
https://ithelp.ithome.com.tw/upload/images/20200703/20017294kuCJXrJ5hY.jpg
且匯出的網頁還會顯示錯誤訊息
https://ithelp.ithome.com.tw/upload/images/20200703/20017294cQFZmO7tA9.jpg

程式碼如下:

<!--#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變數值,以便登入後,可以建立使用者資料夾?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-07-03 23:08:24

可以不要刪除 Excel 檔嗎?

另外請教一點
如果使用者在瀏覽器輸入以下網址

你的host domain/test/filedel.asp?delpath=*.*

你的host domain/test/filedel.asp?delpath=c:\*.*

會發生什麼事嗎?

看更多先前的回應...收起先前的回應...

哈~那個應該會先出現檔案不存在的訊息吧~
我記得 . 會被判斷成非法字元~

b7307024 iT邦新手 3 級 ‧ 2020-07-07 10:51:44 檢舉

海綿寶寶大神,我大概知道你要表達的內容是什麼,也就是以資安角度考量,不建議我這樣做對吧? 且在瀏覽器使用檢視原始碼,也就可以看到我刪除的網頁名稱filedel.asp,我剛剛也發現這是極度不安全的作法。那請問有什麼其他建議的做法嗎?謝謝!

我的建議做法就是「不要刪除Excel」

另外的做法就是「不要在本機產生Excel檔案再提供下載」
改成「本機不存Excel檔案,直接提供資料給使用者下載」
沒有刪除,就沒有傷害...XD
這兩篇參考看看
classic ASP 的資料不好找了(都是 ASP.NET)
參考一
參考二

b7307024 iT邦新手 3 級 ‧ 2020-07-08 16:34:20 檢舉

海綿寶寶大神

參考一
這個作法一直都有在使用,但是有缺點,有時候直接開啟會打不開且出現錯誤,要下載儲存檔案才可以打開,
https://ithelp.ithome.com.tw/upload/images/20200708/200172946Pmvw6xyiz.jpg

可以打開後又會先出現警告訊息,才可以打開
https://ithelp.ithome.com.tw/upload/images/20200708/20017294hHvuCH2SSD.jpg

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

參考二
研究了一下,看起來像是ASP.NET的語法,有try-catch我想應該不是ASP能夠識別的吧?/images/emoticon/emoticon37.gif

謝謝!

0

從訊息來看,有點像是檔案已經不存在。
因該是沒建立起來才對。

這點得先找一下源頭厘清一下原因。

另外,不要給user可以刪除的控制,這很危險的。
如果你怕匯出檔案太多。可以做一支內部刪除的動作也沒關係。

但千萬不要直接將刪除的操控給user。
會像「海綿寶寶」說的那樣,會很快樂的。

b7307024 iT邦新手 3 級 ‧ 2020-07-07 11:09:11 檢舉

浩瀚星空超人,我看了海綿寶寶大神的回覆後,再去網頁右鍵查看原始檔,也發現的確會有很大的資安問題。

但是可以給予設計上的一些建議作法嗎?

我目前是想到說,可能是匯出Excel檔時,並打包成登入者帳號名稱的壓縮檔,在使用者登出後,就刪除此壓縮檔,但找不到相關範例,完全不知道怎麼改阿~ 哭哭!

我要發表回答

立即登入回答