Response.WriteFile 問題詢問
Dear all,
請教各問 Solution, 我有一支程式去取得 Fielserver 檔案, 然後把資料用 Response.WriteFile 丟給 Client, 但我想在 WriteFile 完成後把, 這支頁面關掉, 請問有何方法, 或是 www.microsoft.com/downloads 的效果,點選以後跳出下載視窗,檔案丟出來後,關閉視窗,謝謝。
try
{
#region File 處理FileInfo fi = new FileInfo(file_path);
if (fi.Extension != null)
{
switch (fi.Extension.ToLower())
{
case ".htm":
case ".html":
type = "text/HTML";
break;...........................................
...........................................
}
}Response.AppendHeader("content-disposition", "attachment; filename=" + Server.UrlEncode(fi.Name));
Response.WriteFile(file_path);
Response.End();
#endregion
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
Respuestas
我自己是用:
http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=8&Function=43
不另外開新視窗。
在上面那個函數的子函數:
http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=8&Function=42
SetResponseHeader("application/octet-stream", strFileName, True)
Response.WriteFile(absPath)
Response.End()我也有專案是這樣呼叫,讓他強制跳出存檔對話盒。
微軟那個主要是因為他做在 Botton 上,不是連結上,所以會另外用個 window.open 來開,若是網址直接是檔案,我記得 IE 會自己關閉這個視窗,或著你可以用開啟來源來關閉它,例如 VBScript:
Set popupWindow = window.open(xxxxx)
popupWindow.close
不過在 Close 前要先讓你的母視窗睡一下,才會進入檔案下載。
我這邊用這樣的方法,下載後 新視窗會自己消失。
如果你那邊還是不行,可能您就在下載檔後,增加一個
增各JavaScriptResponse.Write("<script language='javascript'>window.opener = window; window.close(); </script>");
用JavaScript的方式來關閉。- 我都用 Response.BinaryWrite() 呢 ...
Todas las respuestas
您好:
若用簡單的想法,
您可以在檔案下載的顯示使用 Target="_blank"
ex : 下載檔案 (Target="_blank") 觸發你專門輸出檔案的網頁例如這篇
http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=314597&SiteID=14試試看這樣能否解決您的問題
謝謝回覆, 我剛是這使用 target="_blank",程式會打開空視窗,然後會出現下載檔案對話方塊,但是下載後不會自動關掉新的視窗,請問有什麼方法可以在同一個程式內,Response.WriteFile 後,還可以控制網頁功能,謝謝
我自己是用:
http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=8&Function=43
不另外開新視窗。
在上面那個函數的子函數:
http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=8&Function=42
SetResponseHeader("application/octet-stream", strFileName, True)
Response.WriteFile(absPath)
Response.End()我也有專案是這樣呼叫,讓他強制跳出存檔對話盒。
微軟那個主要是因為他做在 Botton 上,不是連結上,所以會另外用個 window.open 來開,若是網址直接是檔案,我記得 IE 會自己關閉這個視窗,或著你可以用開啟來源來關閉它,例如 VBScript:
Set popupWindow = window.open(xxxxx)
popupWindow.close
不過在 Close 前要先讓你的母視窗睡一下,才會進入檔案下載。
我這邊用這樣的方法,下載後 新視窗會自己消失。
如果你那邊還是不行,可能您就在下載檔後,增加一個
增各JavaScriptResponse.Write("<script language='javascript'>window.opener = window; window.close(); </script>");
用JavaScript的方式來關閉。- 我都用 Response.BinaryWrite() 呢 ...
謝謝大家回覆, 我又試寫了一段程式, 程式呈現有兩種方式,
1. PSD、AI、PDF 跳出下載對話方塊後,不會自動關閉視窗
2. EXE、BMP、BIN 跳出下載對話方塊後,就會自動關閉視窗
Response.AppendHeader("content-disposition", "attachment; filename=DC7057.bin");
Response.WriteFile(@"C:\_job_items\temp\scaning\DC7057.bin");
Response.End();所以我想再試試看 用 Javascript 然後讓母視窗睡一下的方法,因為之前我開啟下載視窗後,接著做 [window name].close() 的指令時,他就直接關掉了,另外我也會試試看 Response.BinaryWrite() 的方式,謝謝。
Dear wave0707
小弟也遇到同樣的問題,請問您解決產生pdf後,不會自動關閉的問題了嗎?
說實在的,我不太清楚為何要另開視窗。
直接點選 aspx 的網址不就可以輸出下載?就不會有不能關閉視窗的問題,因為根本不存在另開視窗。
其實我也忘了當初未何要開新視窗,可能是想再傳出檔案後,在針對頁面作些處理,另外就是因為我的 FileServer 跟 IIS Server 不是在同一台,為了跨機器存取,我在 .net framework 1.X 時,使用 impersonate 來做存取不成功,只好把所有的檔案存取,統一寫在一個 Application 裡面,然後給他匿名存取,存取帳號使用 Admin 權限的帳號,才過得去,為了好管理,我把檔案存取都用跳出視窗來處理,現在 ASP2.0 好像就不需要了,我現在使用 整合Window 驗證,然後使用 impersonate,就可以存取別台機器,這樣我就不需要再把檔案存取抽出來寫了。
現在我是直接採用 .aspx 讓他在同一視窗執行,確實已經不需要關閉視窗的功能,不過也無法做下載檔案後的程式處理。微軟 Download 的功能,我看了他的 Script,是用 Client script 來達成目標的,所以他還能導到感謝頁面,至於有些檔案類型會自動關頁面,有些不行,我想應該跟 Client 端 IE 的設定有關 (檔案的關連),因為我不能用程式控制開關跳出視窗,所以我就不用跳出視窗的方式,有些網站在下載檔案後,會留個小視窗在螢幕上,我想可能也是這各問題。
你要的東西我做了一個簡單的範例:
http://tlcheng.twbbs.org/Test/Download/welcome.htm
完整範例壓縮檔:
http://tlcheng.twbbs.org/Test/Download/download.zip
檔名都先寫死,比較好測試,作法邏輯:
welcome.htm 點連結 -> 跳出視窗 Test.aspx (Response.WriteFile) -> 下載 pdf 檔 -> 自動關閉
(自己視窗在連結點選後) -> 轉 thanks.htm
註:放在 Test 子目錄下的東西不保證長長久久... 至少這幾天會留著。
微軟 Download Center 的作法應該是:
1. 點選檔案時,轉向到 Thanks 頁面 .
2. 輸出下載路徑到 Thanks 頁面,並設定數秒後啟動下載(使用 window.setTimeout() 加上 window.location.href)
像 CNet, Sourceforge.net 的下載應該也是這樣的作法 .
- 謝謝各位, 我這邊直接執行, 開啟檔案還是沒有自動關閉, 有些電腦執行正常, 我有另外試過不同的檔案格式, 執行結果不盡相同, 有的可以關閉, 有的就空了一各視窗在那邊, 我想在公司再多找幾台來試試, 看是否能使用程式完全控制, 免得使用者會太過困擾

html 改成小朱說的方法,壓縮檔沒動。
不過這樣會跳出警告封鎖列,必須再點一次...
剛剛試過,如果不在乎封鎖列的話,直接用
<iframe style='display: none; ' src="test.aspx"></iframe>
也是可以...
就不用寫 timeout 程式碼。

