上传和下载的续传都是一样的,这里就以下载为例
使用FtpWebRequest类
先说普通的下载,在此基础上修改为支持续传的下载功能
// FTP 下载
private int FtpFileDownload(string savePath, string fileName, string ftpServerIP, string ftpUserID, string ftpPassword)
{
string ftpServerPath = "ftp://" + ftpServerIP + ":23" + fileName; //"
string ftpUser = ftpUserID;
string ftpPwd = ftpPassword;
string saveFilePath = savePath;
FileStream outputStream = null;
FtpWebResponse response = null;
FtpWebRequest reqFTP;
try
{
outputStream = new FileStream(saveFilePath, FileMode.Create);
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpServerPath));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.KeepAlive = false;
reqFTP.Timeout = 3000;
reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);
response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
int bufferSize = 2048;
int readCount;
ftpFileReadSize = 0;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
ftpFileReadSize += readCount;
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}
catch (Exception ex)
{
Trace.WriteLine("FtpClient异常:" + ex.Message);
if (outputStream != null)
{
outputStream.Close();
}
if (response != null)
{
response.Close();
}
return -1;
}
return 0;
}
在此基础上把断点续传加上去,续传之前首先需要做验证,判断是否符合续传规则,比如:本地文件小于服务器文件大小,代码逻辑如下
Localsize:本地文件大小
FileSize:服务器文件大小
reqFTP.ContentOffset = Localsize 续传关键参数ContentOffset:获取或设置请求所下载的文件的字节偏移量。
outputStream.Seek FileStream.Seek(Int64, SeekOrigin) 方法, 将该流的当前位置设置为给定值。
if (Localsize > 0 && Localsize < FileSize)
{
reqFTP.ContentOffset = Localsize;
outputStream.Seek(Localsize, SeekOrigin.Current);
}
else if (Localsize == FileSize)
{
return;
//Localsize = 0;
}
//获取文件大小的代码
public long GetFileSize(string url)//获取大小就要重新连接吗?是的,method只能有一个
{
long fileSize = 0;
try
{
FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));//路径创造新的连接
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;//方法大小
FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
fileSize = response.ContentLength;//获得大小
response.Close();
}
catch (Exception ex)
{
}
return fileSize;
}
到这里下载续传就结束了,上传的续传可以以这个为参考修改
关键代码
reqFTP.ContentOffset = Localsize