[ASP.NET] SampleCode–iframe實作Download功能,保持頁面程序完全執行完畢

  • 6277
  • 0

[ASP.NET] SampleCode–iframe實作Download功能,保持頁面程序完全執行完畢

這是來自論壇上的一則發問,需求是在頁面中提供Download功能,但原本的頁面

在Download運作後要能持續執行完畢,換言之就是整個頁面運作不受Download功

能的影響,在postback後能完全執行完所有預期要做的事情。

 

一般常見的Download功能的程式碼大致如下

//前面省略.....
Response.ContentType = "Application/save-as";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "Attachment; filename=" + HttpUtility.UrlEncode(filename));
Response.BinaryWrite(Buf);
Response.End();

//在頁面顯示目前時間
Response.Write(DateTime.Now.ToString());

 

而若是直接在原本頁面的事件中(或控制項事件)進行時,則會因為 Response.End 的

關係,而影響到原本預期應該要處理的事情,例如上述程式碼的 9 行輸出時間的部份

將不會被執行,原因如下

image

 

所以若想要提供Download功能,又期望原本的頁面其它後續要處理的事件能完整執行

這部份我們可以利用 iframe 做個小技巧的轉彎,直接來看實作

 

  • 在頁面藏一個iframe ,並設置其style為隱藏
<iframe id="dlframe" runat="server" style="display: none"></iframe>
  • 利用泛型處理常式(.ashx)背後處理Download的行為
public void ProcessRequest(HttpContext context)
{
   
   //前面程式碼省略.......
    context.Response.ContentType = "Application/save-as";
    context.Response.Charset = "utf-8";
    //透過Header設定檔名
    context.Response.AddHeader("Content-Disposition", "Attachment; filename=" + HttpUtility.UrlEncode(filename));
    context.Response.BinaryWrite(Buf);
    context.Response.End();
}
  • 原本頁面的Button 事件,把 iframe 的 src 屬性指向泛型處理常式(.ashx)
protected void Button1_Click(object sender, EventArgs e)
{
    this.dlframe.Attributes.Add("src", "Download.ashx");
    
    //頁面顯示時間
    Response.Write(DateTime.Now.ToString());
}

 

這樣的一個方式就形成了把 Download的 request 行為交由另一個頁面來進行,也就避開了

Response.End 的影響,因此頁面顯示時間的程式碼部份也會正常的被執行

image

 

PS:以上是一個簡單的小技巧示範,若要依條件Download不同的檔案,則可以利用傳

遞參數的方式,傳給泛型處理常式(.ashx)即可

 

Ref :

HttpResponse.End 方法

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18