我製作的系統內有類似檔案總管的功能,左邊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
沒有留言:
張貼留言
跟我說說話吧!