FtpWebRequest не загружает более 8820 байт данных - PullRequest
1 голос
/ 17 октября 2011

Я пытаюсь передать файлы между несколькими сайтами и использую FtpWebRequest, чтобы загрузить файл с сайта A и загрузить его на сайт B.

Проблема, с которой я сталкиваюсь, заключается в том, что при загрузке файла я не получаю больше 8820 байт данных.

Вот код, который я использую:

public FtpFile Download(string path)
{
  string fullpath = ConstructFullpath(path);

  FtpWebRequest request = (FtpWebRequest)WebRequest.Create(fullpath);
  request.Method = WebRequestMethods.Ftp.DownloadFile;
  // login
  request.Credentials = new NetworkCredential(Username, Password);  

  FtpWebResponse response = (FtpWebResponse)request.GetResponse();
  Stream responseStream = request.GetResponse().GetResponseStream();

  byte[] data = new byte[20000];
  int length = responseStream.Read(data, 0, data.Length);
  responseStream.Close();

  FtpFile file = new FtpFile(path, data, length);
  return file;
}

public bool Upload(FtpFile file)
{
  if (!DirectoryExists(GetDirectory(file.Path)))
  {
    CreateDirectory(GetDirectory(file.Path));
  }

  string fullpath = ConstructFullpath(file.Path);
  FtpWebRequest request = (FtpWebRequest)WebRequest.Create(fullpath);
  request.Method = WebRequestMethods.Ftp.UploadFile;
  request.Credentials = new NetworkCredential(Username, Password);


  Stream stream = request.GetRequestStream();
  stream.Write(file.Data, 0, file.Length);
  stream.Close();

  FtpWebResponse response = (FtpWebResponse)request.GetResponse();
  return true;
}

Первое изображение показывает исходный каталог. Второе изображение показывает каталог назначения.

The source web directory

The destination web directory Я попытался сохранить файлы локально и получить тот же результат.

1 Ответ

4 голосов
/ 17 октября 2011

Вы звоните Read только один раз:

byte[] data = new byte[20000];
int length = responseStream.Read(data, 0, data.Length);
responseStream.Close();

Нет гарантии, что все данные будут прочитаны за один вызов, и вы никогда не должны полагаться на это. Вы должны выполнить цикл (например, копирование данных в MemoryStream) до тех пор, пока Read не вернет 0.

Если вы используете .NET 4, Stream.CopyTo делает это легко:

MemoryStream ms = new MemoryStream();
responseStream.CopyTo(ms);

Обратите внимание, что вы должны также использовать операторы using вместо того, чтобы явно закрывать ресурсы, и это включает FtpWebResponse.

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