Ftp загрузка не удалась после каждых двух или трех успешных загрузок - PullRequest
2 голосов
/ 13 января 2012

При загрузке я получил следующее сообщение об ошибке.Powershell создает zip-файл, используя 7za.exe, и вызывает мою функцию FTP для загрузки файла.Что может вызвать проблему?Будет ли Windows ftp.exe клиент более стабильным?

Исключение вызывает "GetRequestStream" с аргументом "0": "Удаленный сервер возвратил ошибку: (550) Файл недоступен (например, файлне найден, нет доступа). "

Обновление:
Кажется, одни и те же файлы всегда терпели неудачу в цикле.Тем не менее, Это работает, если я просто запускаю ftpFile file_name_with_full_path.(file_name_with_full_path копируется из выходных данных скрипта цикла.

Обновление 2:
Я пытался использовать webclient ($webclient.UploadFile($uri, $File)) дляftp файлы. Та же ошибка.

Обновление 3:
Найден этот Вопрос . Возможно, потребуется добавить $ftp.KeepAlive = false. Почему?

function ftpFile
{
    Param (
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [ValidateScript({Test-Path $_})]
        [String] 
        $filePath
        ,
        [Parameter(Mandatory=$false)]
        [String]
        $ftpUrl = "ftp://10.0.1.1/Data/"
        ,
        [Parameter(Mandatory=$false)]
        [String]
        $Login = "username"
        ,    
        [Parameter(Mandatory=$false)]
        [String]
        $password = "password"
    )
    Process {
        try {
            $ftp = [System.Net.FtpWebRequest]::Create("$ftpUrl/$(Split-Path $filePath -Leaf)")
            $ftp = [System.Net.FtpWebRequest]$ftp
            $ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
            $ftp.Credentials = new-object System.Net.NetworkCredential("$Login","$password")
            $ftp.UseBinary = $true
            $ftp.UsePassive = $true

            # read in the file to upload as a byte array
            $content = gc -en byte $filePath
            $ftp.ContentLength = $content.Length

            # get the request stream, and write the bytes into it
            $rs = $ftp.GetRequestStream()
            $rs.Write($content, 0, $content.Length)
            $rs.Close()
            $rs.Dispose()

            echo "ftpFile: $filePath size: $($content.Length)"
        }
        catch {
            throw "FTP: $_"
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 января 2012

Нашел этот вопрос. Нужно добавить $ftp.KeepAlive = false.

0 голосов
/ 13 января 2012

FTP Ошибка 550 запрещена, и имеет тенденцию быть конфликтом имени пользователя / пароля.

Если вы используете цикл и передаете одно и то же имя пользователя и пароль каждый раз, когда вызывается эта функция А ТАКЖЕ он работает на некоторых итерациях циклов, а не на других ЗАТЕМ вам нужно проверить журналы авторизации / ошибок ftp на сервере, чтобы понять, почему вам отказывают.

Как спросил @AndyArismendi, всегда ли происходит сбой на одном и том же файле? Без более полного кода и понимания вашего использования трудно найти простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...