Как загрузить файлы, содержащие знак фунта / ха sh «#» в имени файла, с FTP-сервера с помощью класса PowerShell FtpWebRequest - PullRequest
2 голосов
/ 25 марта 2020

Я создал скрипт для загрузки файлов с FTP-сервера. Сценарий работает со всеми файлами, которые я пытался загрузить, кроме файлов, которые содержат #. После некоторых исследований я не могу найти решение этой проблемы. Мой код для загрузки файла указан ниже.

function Get-FtpFile
{
  Param ([string]$fileUrl, $credentials, [string]$destination)
  try
  {
    $FTPRequest = [System.Net.FtpWebRequest]::Create($fileUrl)
    if ($credentials) 
    {
        $FTPRequest.Credentials = $credentials
    }
    $FTPRequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
    $FTPRequest.UseBinary = $true

    # Send the ftp request
    $FTPResponse = $FTPRequest.GetResponse()

    # Get a download stream from the server response
    $ResponseStream = $FTPResponse.GetResponseStream()

    # Create the target file on the local system and the download buffer
    $LocalFile = New-Object IO.FileStream ($destination,[IO.FileMode]::Create)
    [byte[]]$ReadBuffer = New-Object byte[] 1024

    # Loop through the download
    do {
        $ReadLength = $ResponseStream.Read($ReadBuffer,0,1024)
        $LocalFile.Write($ReadBuffer,0,$ReadLength)
       }
    while ($ReadLength -ne 0)
    $LocalFile.Close()
  }
  catch [Net.WebException]
  {
    return "Unable to download because: $($_.exception)"
  }
}

Я попытался использовать WebRequest.DownloadFile() вместо этого, и он все еще не работает с файлами, которые содержат #, я также попытался переименовать файл, используя метод переименования FtpWebRequest, который также не работал.

Кто-нибудь знает какое-либо решение или способ решения этой проблемы?

1 Ответ

3 голосов
/ 26 марта 2020

Вы должны кодировать URL # как %23 в своем URL ($fileUrl).


Если вы хотите сделать это программно, см .:
Загрузите файл с именем, включающим специальные символы, с FTP-сервера в C#

В PowerShell это будет выглядеть так:

Add-Type -AssemblyName System.Web
$fileUrl = "https://example.com/path/" + [System.Web.HttpUtility]::UrlEncode($filename)
...