Загрузка папки в подпапку ftp возвращает ошибку (550) файл недоступен, нет доступа

Я пытаюсь загрузить изображения на ftp. Мне нужно, чтобы он был в сжатой папке с определенным именем, а затем загружал эту папку в определенный каталог. Каждый раз, когда я пытаюсь, я получаю сообщение об ошибке Удаленный сервер вернул ошибку: (550) Файл недоступен Этот код работает нормально, когда я пытаюсь загрузить по одному изображению за раз. Здесь я пытаюсь загрузить целую папку. Я проверил uri (я скопировал его из отладки), и все прошло нормально. Есть ли другой способ, которым я должен загружать папки? Я думал, что это проблема с правами на запись, но я могу вручную войти в систему и загрузить папку в нужное место. Затем я попытался получить список каталогов, который я могу. Я тоже не могу закинуть папку в корень. Я совсем в отчаянии! Я даже не знаю, где гуглить!

 string ftpPassword = ConfigurationManager.AppSettings["ftpPassword"].ToString();
  string uri = remoteDirectory;
  FileInfo fileInf = new FileInfo(FileToUpload);
  // Create FtpWebRequest object from the Uri provided
  FtpWebRequest reqFTP = null;
  reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
  reqFTP.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
  reqFTP.KeepAlive = false;
  reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
  // Specify the data transfer type.
  reqFTP.UseBinary = true;
  // Notify the server about the size of the uploaded file
  reqFTP.ContentLength = fileInf.Length;
  // The buffer size is set to 2kb
  int buffLength = 2048;
  byte[] buff = new byte[buffLength];
  int contentLen;
  // open file to be uploaded
  using (FileStream fs = fileInf.OpenRead())
  {
  try
  {
  // Stream to which the file to be upload is written
  using (Stream strm = reqFTP.GetRequestStream())
  {
  // Read from the file stream 2kb at a time till Stream content ends
  contentLen = fs.Read(buff, 0, buffLength);
  while (contentLen != 0)
  {
  // Write Content from the file stream to the FTP Upload Stream
  strm.Write(buff, 0, contentLen);
  contentLen = fs.Read(buff, 0, buffLength);
  }
  }
  reqFTP = null;
  ////Update the database with the new image location and delete the img from the uploadedimages folder
  //DataAccess.UpdateImageDB(item.ProductID, item.ImgFolder + "/" + item.IMG);
  System.IO.File.Delete(fileInf.ToString());
  }
  {
  Console.WriteLine(ex.Message, "Upload Error");
  }

person SSs    schedule 06.12.2010    source источник


Ответы (3)


Вам, вероятно, нужно проверить, существует ли каталог (папка), и если это не так, вам нужно создать его на FTP. Я почти уверен, что большинство FTP-клиентов сделают это за вас.

person Tony Abrams    schedule 06.12.2010
comment
Я знаю, что папка существует. Я извлекаю имя папки из базы данных. Кроме того, когда я прохожу через это, я скопировал и вставил uri в браузер, и он работает без проблем. - person SSs; 08.12.2010
comment
Когда я захожу на свой ftp с помощью filezilla, я заметил, что владелец/группа говорит, что никто не рулит. Может ли это иметь какое-то отношение к этому? - person SSs; 08.12.2010
comment
Возможно, это проблема с правами доступа к папке. - person Tony Abrams; 08.12.2010

Мне пришлось войти в разрешения NTFS и добавить IUSR с «полным доступом» к папке ftp.

person Conrad B    schedule 12.08.2011

Чтобы решить эту проблему, необходимо заставить команду 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

person Taras Kravets    schedule 06.11.2013