2009-10-06 68 views
2

我有以下代碼,允許用戶下載文件。我需要知道(如果可能)他們是否成功下載了文件。有什麼樣的回調,我可以把它們知道他們是否成功地下載它?謝謝。如何確定文件是否已下載

string filename = Path.GetFileName(url); 
context.Response.Buffer = true; 
context.Response.Charset = ""; 
context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
context.Response.ContentType = "application/x-rar-compressed"; 
context.Response.AddHeader("content-disposition", "attachment;filename=" + filename); 
context.Response.TransmitFile(context.Server.MapPath(url)); 
context.Response.Flush(); 

回答

4

爲什麼不添加一行讓您知道它已完成?在context.Response.Flush()之後,它應該完成。

+0

我想這是我的問題。我不知道它是否在transmitfile調用之後繼續同步,或者它是否只是調用它,讓它做它的事情,然後調用flush。我會試一試。謝謝。 – geoff 2009-10-06 17:29:39

0

我想這是不可能的。

響應只是一個與IIS交互的內存對象。您無法知道瀏覽器是否完全下載了文件,因爲用戶可能會在最後一個字節到達之前取消,但在IIS完成發送整個流後。

您可以嘗試實施的IHttpHandler,連續過程()方法將文件寫入context.Response的塊,和同花順(),檢查這樣

context.Response.Flush(); 
if (!context.Response.IsClientConnected) 
// handle disconnect 

這是最接近我能想想解決你的問題。

2

你可以做這樣的事情:


try 
{ 
    Response.Buffer = false; 
    Response.AppendHeader("Content-Disposition", "attachment;filename=" + file.Name); 
    Response.AppendHeader("Content-Type", "application/octet-stream"); 
    Response.AppendHeader("Content-Length", file.Length.ToString()); 

    int offset = 0; 
    byte[] buffer = new byte[64 * 1024]; // 64k chunks 
    while (Response.IsClientConnected && offset < file.Length) 
    { 
     int readCount = file.GetBytes(buffer, offset, 
      (int)Math.Min(file.Length - offset, buffer.Length)); 
     Response.OutputStream.Write(buffer, 0, readCount); 
     offset += readCount; 
    } 

    if(!Response.IsClientConnected) 
    { 
     // Cancelled by user; do something 
    } 
} 
catch (Exception e) 
{ 
    throw new HttpException(500, e.Message, e); 
} 
finally 
{ 
    file.Close(); 
}