在使用PowerShell断开连接后,如何恢复FTP上传



我有一个powershell脚本,我用来从我们到欧洲,用来ftp a 7.3 GB文件。该脚本正常工作,直到连接下降并且传输停止。

我尝试了使用Try-Catch和重试计数器的多个版本,因此,如果连接失败,则它将重试发送相同的块。

这通常有效,但问题是连接下降时,如果连接设法将一半的块发送到FTP位置,然后连接失败,它会重试以再次发送整个块向上发送较大的文件。

这个较大的文件也是一个损坏/无效的文件,因为它只是比预定的堆和字节更多的堆。

我用来ftp的代码片段是:

# FTP connection details
$ftp_addr = "ftp://ftp.example.com/Backups/"
$user = "abc"
$pass = "1234"
$bufSize = 256mb
# some more irrelevant code here where I identify files to be FTP'ed etc.
# ......
# Initialize connection to FTP
$ftp = [System.Net.FtpWebRequest]::Create($destination_filename+".zip")
$ftp = [System.Net.FtpWebRequest]$ftp
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftp.Credentials = new-object System.Net.NetworkCredential($user, $pass)
$ftp.Timeout = -1              #infinite timeout
$ftp.ReadWriteTimeout = -1     #infinite timeout
$ftp.UseBinary = $true
$ftp.UsePassive = $true
$requestStream = $ftp.GetRequestStream()
$fileStream = [System.IO.File]::OpenRead($backup_target_app_data)
$chunk = New-Object byte[] $bufSize
try {
    while( $bytesRead = $fileStream.Read($chunk,0,$bufsize) )
    {
        $retryCount = 0
        while ($retryCount -ne 30) {
            try {
                    $requestStream.write($chunk, 0, $bytesRead)
                    $requestStream.Flush()
                }
            catch { 
                    $retryCount += 0 
                }
        }
    }
    $FileStream.Close()
    $requestStream.Close()

现在,我不确定如何管理。我一直在考虑将我的块大小从256MB缩小到TCP包的大小,但据我所知,这些大小也可以变化(最高64kb(。

所以,我正在寻找一种处理此连接的方法,因为我目前不确定该如何做。任何帮助都非常感谢。

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

为此使用FtpWebRequest.ContentOffset

使用完整代码上传的相关问题(尽管C#(:
在脱离连接的情况下,如何使用自动简历下载FTP文件


或使用可以自动恢复转移的FTP库。

例如,winscp .NET组件做。有了它,可重新上传的上传就像:

# 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
$session.PutFileToDirectory("C:pathfile.zip", "/home/user")

(我是WINSCP的作者(

最新更新