歡迎使用CSDN-markdown編輯器

C# - 文件下載

  • 文件分塊下載
    • 原理
      每次只讀取一部分文件流,如100k到緩衝區,使用flush()將緩衝區的內容刷新到文件中。
    • 代碼
public void Download(filePath){
    filePath=Server.MapPath(filePath);; //要下載的文件路徑
    string fileName = "downloadfile.txt";//客戶端將要保存的文件名                  
    const long Size = 102400;//緩衝區大小100K ,每次讀取文件,只讀取100K,緩解服務器的壓力  
    byte[] buffer = new byte[Size];  
    FileStream stream = null; 
    try{
        stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);//打開文件
        Response.Clear();
        long fileSize= stream.Length ;//獲取下載的文件總大小  
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
        while (fileSize> 0 && Response.IsClientConnected)
        { 
            int lengthRead=stream.Read(buffer,0,Convert.ToInt32(Size));//讀取的大小  
            Response.OutputStream.Write(buffer, 0, lengthRead);
            Response.Flush();
            fileSize= fileSize- lengthRead;
        }
    }
    catch(Exception ex){
        Response.Write("下載失敗:" + ex.Message);
    }
    finally{
        if (stream != null)
        {
            stream.Close();
        }
        Response.Close();
    }
}
  • 從ftp文件服務器上分塊下載文件
    • 原理
      先從ftp服務器上讀取部分文件流到緩衝區,然後再使用flush()函數將緩衝區的文件刷新到文件中。
    • 代碼
      FTPHelper中的下載方法
/// <summary>
/// 文件下載
/// </summary>
/// <param name="buffer">緩衝區</param>
/// <param name="Size">讀取文件大小</param>
/// <param name="URIpath">ftp文件路徑</param>
/// <returns></returns>
public int DownLoadFile(byte[] buffer, long Size, string URIpath)
{ 
    FtpWebRequest ftp;
    int lengthRead = 0;
    try
    {
        ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(URIpath));
        ftp.Method = WebRequestMethods.Ftp.DownloadFile;
        ftp.UseBinary = true;
        ftp.Credentials = new NetworkCredential(ConfigureHelper.getConfigKey("ftpUserName"), ConfigureHelper.getConfigKey("ftpPassword"));
        FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
        Stream ftpStream = response.GetResponseStream();
        lengthRead = ftpStream.Read(buffer, 0, Convert.ToInt32(Size));
        ftpStream.Close();
        response.Close();
    }
    catch (Exception e)
    {
    }
    return lengthRead;
} 

controller方法

public void Download(filePath){
    string fileName = "downloadfile.txt";//客戶端將要保存的文件名                  
    const long Size = 102400;//緩衝區大小100K ,每次讀取文件,只讀取100K,緩解服務器的壓力  
    byte[] buffer = new byte[Size];   
    try{ 
        Response.Clear();
        long fileSize= getFileSize();//獲取下載的文件總大小  
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
        while (fileSize > 0 && Response.IsClientConnected)
        { 
            int lengthRead = FTPClientHelper.ftp.DownLoadFile(buffer, Size , filePath);//讀取的大小  
            Response.OutputStream.Write(buffer, 0, lengthRead);
            Response.Flush();
            fileSize= fileSize- lengthRead;
        }
    }
    catch(Exception ex){
        Response.Write("下載失敗:" + ex.Message);
    }
    finally{
        Response.Close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章