如何在中断互联网后继续或恢复FTP上传

时间:2017-01-21 13:11:59

标签: c# .net file-upload ftp ftpwebrequest

我使用下面的代码(C#.NET 3.5)上传文件:

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://someweb.mn/altanzulpharm/file12.zip");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.KeepAlive = true;
request.UseBinary = true;
request.Credentials = new NetworkCredential(username, password);

FileStream fs = File.OpenRead(FilePath);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();

Stream ftpstream = request.GetRequestStream();
ftpstream.Write(buffer, 0, buffer.Length);
ftpstream.Close();

但是当互联网中断时,上传会中断。中断发生的时间非常短,几乎是一毫秒。但永远上传休息!

中断互联网后是否可以继续或继续上传?

2 个答案:

答案 0 :(得分:3)

我不相信FtpWebRequest在失去连接后支持重新连接。如果服务器支持,您可以从给定位置恢复上传(此支持不是必需的,并且可能不太常见,需要重试下载)。

您需要设置FtpWebRequet.ContentOffset上传。文章中的部分样本:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.ContentOffset = offset;

FTP协议本身恢复的内部细节 - RFC959: 3.5 - Error recovery and restart。显示下载重试代码的问题 - Downloading from FTP with c#, can't retry when fail

答案 1 :(得分:0)

FtpWebRequest中断连接后,恢复传输的唯一方法是重新连接并开始写入文件末尾。

为此,请使用FtpWebRequest.ContentOffset


或者使用可以自动恢复传输的FTP库。

例如WinSCP .NET assembly。有了它,可恢复的上传就很简单了:

# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Ftp
    HostName = "ftp.example.com"
    UserName = "user"
    Password = "mypassword"
}

$session = New-Object WinSCP.Session

# Connect
$session.Open($sessionOptions)

# Resumable upload
$transferResult = $session.PutFiles("C:\path\file.zip", "/home/user/file.zip").Check()

(我是WinSCP的作者)