2012-02-28 164 views
0
protected void downloadFunction(string filename) 
{ 
    string filepath = @"D:\XtraFiles\" + filename; 
    string contentType = "application/x-newton-compatible-pkg"; 

    Stream iStream = null; 
    // Buffer to read 1024K bytes in chunk 
    byte[] buffer = new Byte[1048576]; 

    // Length of the file: 
    int length; 
    // Total bytes to read: 
    long dataToRead; 

    try 
    { 
     // Open the file. 
     iStream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read); 

     // Total bytes to read: 
     dataToRead = iStream.Length; 
     HttpContext.Current.Response.ContentType = contentType; 
     HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)); 

     // Read the bytes. 
     while (dataToRead > 0) 
     { 
      // Verify that the client is connected. 
      if (HttpContext.Current.Response.IsClientConnected) 
      { 
       // Read the data in buffer. 
       length = iStream.Read(buffer, 0, 10000); 

       // Write the data to the current output stream. 
       HttpContext.Current.Response.OutputStream.Write(buffer, 0, length); 

       // Flush the data to the HTML output. 
       HttpContext.Current.Response.Flush(); 

       buffer = new Byte[10000]; 
       dataToRead = dataToRead - length; 
      } 
      else 
      { 
       //prevent infinite loop if user disconnects 
       dataToRead = -1; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     // Trap the error, if any. 
     HttpContext.Current.Response.Write("Error : " + ex.Message + "<br />"); 
     HttpContext.Current.Response.ContentType = "text/html"; 
     HttpContext.Current.Response.Write("Error : file not found"); 
    } 
    finally 
    { 
     if (iStream != null) 
     { 
      //Close the file. 
      iStream.Close(); 
     } 
     HttpContext.Current.Response.End(); 
     HttpContext.Current.Response.Close(); 
    } 
} 

我donwload功能工作完美,但是当用户下载浏览器不能看到总下载文件的大小。下载功能不显示文件的总大小,下载时

所以现在浏览器说eq。下载8mb的?,下载8mb的142mb。

我错过了什么?

+0

风格危险......“什么是内容长度标题?” – 2012-02-28 10:36:05

+0

顺便说一句,你应该能够使用TransmitFile或类似的;无需编写此代码 - 并且该缓冲区大大超大 – 2012-02-28 10:37:43

回答

1

Content-Length header似乎是你错过了什么。

如果你设置了这个,浏览器就会知道你有多少期待。否则,它会继续前进,直到停止发送数据,并且直到最后才知道它会持续多久。

Response.AddHeader("Content-Length", iStream.Length); 

您还可能有兴趣在Response.WriteFile whcih可以提供将文件发送给客户端的更简单的方法,而不必担心自己的数据流。

0

您需要发送一个ContentLength -Header:

HttpContext.Current.Response.AddHeader(HttpRequestHeader.ContentLength, iStream.Length); 
+0

HttpContext.Current.Response.AddHeader(“Content-Length”,iStream.Length.ToString());诀窍:) – 2012-02-28 10:41:00