2013-03-13 62 views
3

我有这个下载功能,它的工作很好。但是对于文件大小为1.35gb的文件,下载停止在300Mb,382,400mb或1.27Gb。我究竟做错了什么? (下载功能是由这种方式,因为文件需要被隐藏,并且不能在网站上公布。)下载功能失败,文件大小为1.35gb

public static void downloadFunction(string filename) 
{ 
    string filepath = @"D:\texts\New folder\DLfolder\" + filename; 
    string contentType = "application/x-newton-compatible-pkg"; 

    Stream iStream = null; 
    // Buffer to read 10K bytes in chunk 
    //byte[] buffer = new Byte[10000]; 
    // 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)); 
     HttpContext.Current.Response.AddHeader("Content-Length", iStream.Length.ToString()); 

     // 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(); 
    } 
} 
+0

您是否收到任何错误消息,异常? – 2013-03-13 11:48:29

+0

我在这里看到一个很大的安全漏洞。假设'filename'被提供为像“”.. \ .. \ .. \ websites \ myDomain.com \ web.config“'。 – spender 2013-03-13 11:49:23

+0

为什么要分配一个1MB数组,然后每次迭代分配一个〜10k数组? – 2013-03-13 11:51:15

回答

0

你可能已经打的请求超时。请注意,如果文件在经过一段预定时间后停止下载,例如60或300秒。如果是这种情况,您可以在应用程序的web.config中配置超时。

+0

无超时,将锁住浏览器,从下载的随机时间开始 – 2013-03-13 12:22:39