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