2014年5月21日 星期三

ASP.NET 下載檔案功能

一切都是站在巨人肩膀,網路上尋找的解答! 在此將我的應用細節記錄下來。

我製作的系統內有類似檔案總管的功能,左邊TreeView搭配右邊GridView將檔案列出來。希望在GridView列出的檔案上面有按鈕可以下載該檔案。


最後有出現一個錯誤The message received from the server could not be parsed. 無法剖析從伺服器收到的訊息 ...

查到是因為GridView外層有UpdatePanel,Response.Write不能在非同步Postback時作用
參考: http://edgehsu.blogspot.tw/2013/10/aspnetc-updatepanel-responsewrite.html
http://stackoverflow.com/questions/10014920/response-write-and-updatepanel



1. 簡單的解法: 在 UpdatePanel設定PostBackTrigger
<Triggers>        
    <asp:PostBackTrigger ControlID="Btn_download" />
</Triggers>

但是這在我的情況不適用,因為我的按鈕是在GridView裡面動態產生的,要用另一個方法:

2. 在GridView 的 RowDataBound事件內加上RegisterPostBackControl這段東西:

Button downloadbtn = (Button)e.Row.FindControl("Btn_Download");
ScriptManager manager = ScriptManager.GetCurrent(this.Page);
manager.RegisterPostBackControl(downloadbtn);

意思就是幫每個產生的按鈕都註冊強行PostBack~就解決了

----------------------------------------------------------------------------

再來就是下載檔案的部分。

在GridView1的RowCommand事件裡面實作。我把檔案的完整路徑用CommandArgument傳進去

string path = e.CommandArgument.ToString();
FileInfo file = new FileInfo(path); //FileInfo 是要 using System.IO
     if (file.Exists)
     {
             Response.Clear();
             Response.ClearHeaders();
             Response.Buffer = false;
             Response.ContentType = "application/octet-stream"; // 指定檔案類型
             string newname = System.Web.HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8); //解決中文檔名亂碼
             Response.AddHeader("Content-Disposition", "attachment;filename=" + newname); // 設定檔名
             Response.AppendHeader("Content-Length", file.Length.ToString()); // 表頭加入檔案大小
             Response.WriteFile(file.FullName);
             Response.Flush();
             Response.End();
     }

參考來源:
http://blog.miniasp.com/post/2008/04/20/ASPNET-Force-Download-File-and-deal-with-Chinese-Filename-correctly.aspx
http://blog.xuite.net/tolarku/blog/64787475-%5BASP.NET%5D+C%23+%E9%BB%9E%E6%93%8A%E6%8C%89%E9%88%95%E4%BE%86%E4%B8%8B%E8%BC%89%E6%AA%94%E6%A1%88+-+download+file

沒有留言:

張貼留言

跟我說說話吧!