Использование команды FTP "append" - PullRequest
1 голос
/ 29 марта 2010

Я хочу загрузить файл на FTP-сервер программно (C ++). Если при загрузке файла соединение потеряно, я не хочу загружать файл с нуля, а загружаю только ту часть, которую я не отправил.

Соответствует ли команда APPE моему требованию? Какой список команд FTP я должен использовать именно? И как?

Ответы [ 2 ]

6 голосов
/ 13 апреля 2010

Я ищу информацию о команде APPE FTP, что на самом деле она делает, но большинство сайтов только добавляют. Затем я пробую команду, чтобы убедиться, что она ведет себя так, как ожидалось.

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

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

Ответ: Чтобы возобновить файл, если последняя передача не удалась, такой команды для этого не существует, но нам нужно использовать последовательность команд для ее достижения.

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

Использовать APPE (я понял из журнала FileZilla):

  1. Используйте SIZE, чтобы проверить, существует ли файл, и используйте его как маркер возобновления.
  2. Открыть локальную файловую систему и искать по маркеру.
  3. Используйте APPE для загрузки, и FTP-сервер добавит его автоматически.

Использовать STOR с REST (идея пришла из edtFTPnet):

  1. Используйте SIZE, чтобы проверить, существует ли файл, и используйте его как маркер возобновления.
  2. Отправьте REST с результатом, который вы получите от SIZE, чтобы сообщить FTP-серверу, чтобы начать запись в позиции.
  3. Откройте локальную файловую систему и ищите по маркеру.
  4. Используйте STOR как обычную загрузку.

Обратите внимание, что не все серверы FTP поддерживают оба способа. Я вижу, FileZilla переключает это в двух направлениях, в зависимости от сервера. Мои наблюдения показывают, что использование REST является стандартным способом. Загрузка также может использовать REST для начала загрузки с заданной позиции байта.

Помните, что использование поддержки возобновления для типа передачи ASCII приведет к неожиданному результату, поскольку Unix и Windows имеют разное количество байтов разрыва строки.

Попробуйте манипулировать FileZilla, чтобы увидеть поведение в журнале. Вы также можете проверить этот полезный FTP с открытым исходным кодом для библиотеки .NET, как они это делают edtFTPnet

5 голосов
/ 29 марта 2010

Проверьте RFC и, в частности, команду APPEND:

Это команда заставляет сервер-DTP принять данные, переданные через подключение данных и хранить данные в файле на сайте сервера. Если файл, указанный в имени пути, существует на сайте сервера, то данные должны быть приложены к этому файлу; в противном случае файл, указанный в путь должен быть создан на сайт сервера.

Обратите внимание, что вы не можете просто ПРИЛОЖИТЬ тот же файл снова. Вы должны отправить оставшиеся байты. То есть продолжайте в том же положении, когда соединение было потеряно.

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