【问题标题】:can't upload files larger than 2 gb over FTP - Powershell无法通过 FTP 上传大于 2 GB 的文件 - Powershell
【发布时间】:2017-01-15 09:42:13
【问题描述】:

如何使用 powershell 将大于 2 gb 的文件上传到我的 FTP 服务器,我正在使用以下功能

# Create FTP Rquest Object

$FTPRequest = [System.Net.FtpWebRequest]::Create("$RemoteFile")
    $FTPRequest = [System.Net.FtpWebRequest]$FTPRequest
    $FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
    $FTPRequest.Credentials = new-object System.Net.NetworkCredential($Username, $Password)
    $FTPRequest.UseBinary = $true
    $FTPRequest.Timeout = -1
    $FTPRequest.KeepAlive = $false
    $FTPRequest.ReadWriteTimeout = -1
    $FTPRequest.UsePassive = $true

    # Read the File for Upload

    $FileContent = [System.IO.File]::ReadAllBytes(“$LocalFile”)
    $FTPRequest.ContentLength = $FileContent.Length

# Get Stream Request by bytes

try{
    $Run = $FTPRequest.GetRequestStream()
    $Run.Write($FileContent, 0, $FileContent.Length)

# Cleanup

    $Run.Close()
    $Run.Dispose()    
} catch [System.Exception]{
    'Upload failed.'       
}

我在上传时遇到此错误。

 Exception calling "ReadAllBytes" with "1" argument(s): "The file is too long. 
    This operation is currently limited to supporting files less than 2 gigabytes 
    in size."

    +     $FileContent = [System.IO.File]::ReadAllBytes(“$LocalFile”)
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : IOException

我使用了其他功能,但结果上传速度太慢了,好像没有超过 50KB/s 希望有一个解决方案,而不是将大文件分成块

【问题讨论】:

  • 我现在去看看..
  • $FileStream = [System.IO.File]::OpenRead(“$LocalFile”); $FTPRequest.ContentLength = $FileStream.Length; $Run = $FTPRequest.GetRequestStream(); $FileStream.CopyTo($Run); $Run.Close(); $FileStream.Close();
  • 你的意思是这样吗? $FileStream = [System.IO.File]::OpenRead(“$LocalFile”); $FTPRequest.ContentLength = $FileStream.Length; $Run = $FTPRequest.GetRequestStream(); $FileStream.CopyTo($Run); $Run.Write($FileStream, 0, $FileStream.Length); $Run.Close() $FileStream.Close();
  • @Vagho 是的,像这样,但没有$Run.Write($FileStream, 0, $FileStream.Length);

标签: powershell ftp


【解决方案1】:

感谢PetSerAisodawillow

我找到了 2 个对我有用的解决方案。

解决方案 1:sodawillow

    $bufsize = 256mb
    $requestStream = $FTPRequest.GetRequestStream()
    $fileStream = [System.IO.File]::OpenRead($LocalFile)
    $chunk = New-Object byte[] $bufSize

    while ( $bytesRead = $fileStream.Read($chunk, 0, $bufsize) ){
        $requestStream.write($chunk, 0, $bytesRead)
        $requestStream.Flush()
    }

    $FileStream.Close()
    $requestStream.Close()

解决方案 2:PetSerAi

    $FileStream = [System.IO.File]::OpenRead("$LocalFile")
    $FTPRequest.ContentLength = $FileStream.Length
    $Run = $FTPRequest.GetRequestStream()
    $FileStream.CopyTo($Run, 256mb)
    $Run.Close()
    $FileStream.Close()

【讨论】:

  • 您可以增加缓冲区大小以进行流复制$FileStream.CopyTo($Run, 256mb)。这应该可以让它更快。
  • 如何做到不剪切文件?当我运行第二个解决方案时,远程服务器返回 450,当我检查它时,只上传了原始文件的几个字节。
猜你喜欢
  • 2011-06-30
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2013-04-30
  • 2013-01-14
相关资源
最近更新 更多