FTP, GetResponse(), ошибка 550 Файл недоступен

Я создал небольшое приложение для форм Windows, чтобы загрузить файл на один из наших клиентских ftp-сайтов. Но проблема, с которой я столкнулась, заключается в том, что при запуске этого приложения на моем локальном компьютере он успешно загружает файл. Но если я запустил эту программу на нашем сервере, я получаю это сообщение об ошибке:

удаленный сервер возвратил ошибку: (550) Файл недоступен (например, файл не найден, не может получить доступ к файлу), в этой строке 'objFTPRequest.GetRequestStream();'.

Кто-нибудь знает, почему? Мне нужно настроить брандмауэр или что-то еще? Вот мой код;

FileInfo objFile = new FileInfo(filename);
FtpWebRequest objFTPRequest;

// Create FtpWebRequest object 
objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/outbox/" + objFile.Name));

// Set Credintials
objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);

// By default KeepAlive is true, where the control connection is 
// not closed after a command is executed.
objFTPRequest.KeepAlive = false;

// Set the data transfer type.
objFTPRequest.UseBinary = true;

// Set content length
objFTPRequest.ContentLength = objFile.Length;

// Set request method
objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;

// Set buffer size
int intBufferLength = 16 * 1024;
byte[] objBuffer = new byte[intBufferLength];

// Opens a file to read
FileStream objFileStream = objFile.OpenRead();


// Get Stream of the file
Stream objStream = objFTPRequest.GetRequestStream();

int len = 0;

while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
{
    // Write file Content 
    objStream.Write(objBuffer, 0, len);

}

            objStream.Close();
            objFileStream.Close();

Ответ 1

Эта ошибка может быть вызвана несколькими причинами, такими как файл отсутствует на сервере, разрешения безопасности на файл и т.д. и т.д.

Сначала вам нужно выяснить точную причину ошибки. Этого можно добиться, используя следующий код -

try
{
        //Your code
}
catch(WebException e)
{
        String status = ((FtpWebResponse)e.Response).StatusDescription;
}

Как только вы получите точную причину ошибки, вы можете продолжить ее решение.

Вот ссылки, которые вы можете отсылать

http://forums.asp.net/t/1777881.aspx/1

http://nickstips.wordpress.com/2010/10/25/c-ftp-upload-error-the-remote-server-returned-an-error-550-file-unavailable-e-g-file-not-found-no-access/

http://www.dreamincode.net/forums/topic/76361-file-upload-to-server/

http://forums.asp.net/t/1374306.aspx/1

Ответ 3

Я встретил ту же проблему, и это то, что я сделал:

  • Проверить, имеет ли ОС право писать. Найдите папку ftp = > right click = > properties = > security, то вы должны знать, что вам следует делать
  • Проверьте, чтобы ftp-сервер открыл право на запись пользователю, которого вы зарегистрировали. Открыть IIS = > щелкнуть по ftp site = > ftp Правила авторизации = > добавить разрешить правила = > выбрать пользователя или группу для установки прав
  • Проверьте директорию на ftp-сервере, сделайте то же самое на элементе 2.

Я могу использовать четыре изображения, чтобы показать права, которые нужно установить: enter image description here

enter image description hereenter image description hereenter image description here

Ответ 4

Это может быть проще.

Я столкнулся с аналогичной проблемой, и я попробовал все предлагаемое решение, но никто не работал. Я понимаю, как это выглядит так: взгляните

Неверный код на моем конце

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files"), FtpWebRequest)

Измените его в этом простом:

 Dim request As Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://xxx.xxx.xxx.xxx/files/youfilename.ext"), FtpWebRequest)

затем обработано с запросом на заполнение и отправляется на сервер:)

Что все.

Убедитесь, что все разрешения на сервере работают нормально и используют правильные учетные данные.

Ответ 5

Чтобы решить эту проблему, требуется принудительно заставить команду System.Net.FtpWebRequest вернуться к старому поведению того, как она использовалась для работы в .Net Framework 2.0/3.5 и выдавать дополнительную команду CWD перед выпуском фактическая команда.

Чтобы сделать это, необходимо добавить следующий код перед тем, как вызывается любой экземпляр класса System.Net.FtpWebRequest. Код ниже нужно только один раз вызывать, так как он изменяет настройки всего домена приложения.

private static void SetMethodRequiresCWD()
{
        Type requestType = typeof(FtpWebRequest);
        FieldInfo methodInfoField = requestType.GetField("m_MethodInfo", BindingFlags.NonPublic | BindingFlags.Instance);
        Type methodInfoType = methodInfoField.FieldType;


        FieldInfo knownMethodsField = methodInfoType.GetField("KnownMethodInfo", BindingFlags.Static | BindingFlags.NonPublic);
        Array knownMethodsArray = (Array)knownMethodsField.GetValue(null);

        FieldInfo flagsField = methodInfoType.GetField("Flags", BindingFlags.NonPublic | BindingFlags.Instance);

        int MustChangeWorkingDirectoryToPath = 0x100;
        foreach (object knownMethod in knownMethodsArray)
        {
            int flags = (int)flagsField.GetValue(knownMethod);
            flags |= MustChangeWorkingDirectoryToPath;
            flagsField.SetValue(knownMethod, flags);
        }
 }

http://support.microsoft.com/kb/2134299

Ответ 6

Просто, чтобы бросить шляпу в кольцо, я получал ту же ошибку. Когда FTPRequest запрашивал файлы из FTP-службы на одном компьютере (тот же IP-адрес). В запросе я использовал IP-адрес устройства, но как только я изменил его на 127.0.0.1, он сработал. Интересно, что запросы с других IP-адресов обрабатывались и загружались файлы, а не от себя.

Надеюсь, что кто-то помог.

Ответ 7

Когда у меня была такая же проблема, я пробовал все выше, а через день я понял, что путь, который я создал для uri, имеющего пробел между "/" и именем папки

string uri="192.168.1.101/ Sync/Image.jpg";

указанная строка должна быть

string uri="192.168.1.101/Sync/Image.jpg";

эта небольшая ошибка также выдает ту же ошибку и является допустимой ошибкой, потому что это недопустимый путь для нашего файла, если он содержит любые пробелы между "/" и именем папки/файла

Ответ 8

У меня была та же проблема, когда я сравнил с ftpuri и User Name Path, это разрешено Когда я создаю ftp-доступ, я выбрал путь как /directory name

в ftpuri, когда я включил имя каталога, которое дало ошибку, и когда я удалил имя каталога, оно разрешено.

ftpuri с ошибкой

" ftp://www.example.com/Project/yourfilename.ds"

разрешен ftpuri

" ftp://www.example.com/yourfilename.ds"

папка доступа

ftp "/Проект"

Ответ 9

У меня тоже была эта проблема в последнее время. Я обнаружил, что когда я использую ftpUploadFile, программа пытается поместить файл в корневую папку ftp. Нормальная командная строка ftp работала нормально. Однако выдача команды pwd из командной строки ftp показала, что этот конкретный сервер устанавливал другой текущий каталог при входе в систему. Изменение моей ftpUploadFile для включения этой папки разрешило проблему.

Ответ 10

Убедитесь, что целевая папка "исходящие" существует. Это была моя проблема с ошибкой 550.

Просто создайте целевой файл "output" перед загрузкой.

try
        {
            WebRequest request = WebRequest.Create("ftp://" + ftpServerIP + "/outbox");
            request.Credentials = new NetworkCredential("user", "password");
            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            using (var resp = (FtpWebResponse)request.GetResponse())
            {
                Console.WriteLine(resp.StatusCode);
            }
        }
        catch (WebException ex)
        {
            FtpWebResponse response = (FtpWebResponse)ex.Response;
            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
            {
                response.Close();
                //already exists
            }
            else
            {
                response.Close();
                //doesn't exists = it another exception
            }
        }

Ответ 11

У меня была эта проблема. Filezilla был в порядке,.net не был. Это был сервер wordpress. Чтобы заставить его работать, я изменил свой код:

ftp://XXX.XXX.XXX.XXX//folder//" + txtFile.Text

в

ftp://[FTPNAME]@XXX.XXX.XXX.XXX//" + txtFile.Text

и теперь он к счастью работает.

Я не знаю, относится ли это к папкам FTP для Wordpress.