четверг, 31 октября 2013 г.

Бинарный режим передачи в FileZilla

Передача файлов между FTP-клиентом и сервером может осуществляться различными путями. В FTP спецификации (RFC 959) это называется "тип данных", но как правило имеется ввиду "режим передачи" хотя и это не корректно.
Режимы передачи данных:
  • ASCII
  • бинарный ("образ", "режим изображения" в спецификации)
  • EBCDIC
  • локальный
Но зачастую используются только ASCII и бинарный режим.
ASCII режим используется для передачи текстовых файлов. Проблема с текстовыми файлами заключается в том, что разные платформы используют разный символ окончания строки. Microsoft Windows например, использует CR+LF (возврат каретки и перенос строки), тогда как Unix(-подобные) системы, включая Linux и MacOS X, используют только LF, а традиционные MacOS системы (MacOS 9 и старше) только CR. Задачей ASCII режима является корректное распознавние строк в зависимости от системы. Согласно FTP спецификации, ASCII файлы всегда передаются с использованием CR+LF пары как признак окончания строки.

Таким образом в случае передачи файла от клиента к серверу, клиент должен убедиться что используется CR+LF. Поэтому он ничего не добавит на Microsoft Windows, добавит CR на Unix или добавит LF на ранних MacOS к концу каждой строки. Затем, после передачи файла, сервер приводит окончания строк в надлежащий вид, в зависимости от системы. Если это Microsoft Windows - ничего не будет удалено, на Unix - лишние CR удаляются, а на ранних MacOS - не нужные LF.
Тоже самое происходит при скачке клиентом файла с сервера: сервер приводит окончание строк к виду CR+LF, а клиент после получения файла удаляет не нужные окончания.
Поскольку файл изменен, в случае когда клиент и сервер работают на разных системах, этот режим не подходит для передачи файлов с произвольными симолами, т.н. двоичными (бинарными) файлами, например изображения или видео. В случае принудительной передачи бинарных файлов в таком режиме, файл в итоге получается поврежденный и не читается в дальнейшоем.
По сравнению с ASCII режимом, бинарный устроен проще: файл передается как есть, без каких либо изменений.
В случае, когда вы не уверены как режим использовать - используйте бинарный. На данный момент, почти все (хорошие) текстовые редакторы три возможных варианта окончания строки.

Пример


Клиент работает под Windows (CRLF окончание)
Сервер работает под Linux (LF окончание)
Если вы загрузите текстовый файл содержащий 200 строк и общий размер файла составляет 5768 байт, то на сервере он будет иметь размер 5568 байт.
FileZilla никак не анализирует файлы загруженные как ASCII. Так что если у вас смешнные окончание строк, то может случиться нечто неожиданное. Родное окончание строк для Windows - CR+LF. Т.к. это то, что FTP сервер ожидает когда передает файлы в ASCII, FileZilla на Windows никак не конвертирует окончания строк. Теперь представьте, что есть файл со смешанными Windows (CR+LF) и Unix (LF) окончаниями строк. Загрузка этого файла с Windows системы на Unix приведет к замене всех CR+LF на LF. При скачке этого файл снова, FTP сервер сконвертирует все LF в CR+LF. В результате, все LF преобразуются в CR+LF.
Другой пример это текстовый файл со смешанным окончанием строк. FileZilla на Windows заливает этот файл на FTP сервер работающий на Windows - не производится никакого преобразования. Некторые текстовые редакторы обрабатывают такие смешанные окончания и текст выглядит хорошо. Тем не менее некоторые программы могут некорректно обрабатывать такие файлы т.к. запутаны наличием Unix-подобного окончания строк (LF).
Еще один пример, Windows (CR+LF) текстовый файл был залит на Unix FTP сервер в бинарном режиме. Если этот файл скачать в ASCII режиме, FTP сервер переведет LF в CR+LF так что CR+LF будет конвертирован в CR+CR+LF. FileZilla на Windows ожидает файл с CR+LF окончанием (согласно FTP спецификации), и никаких преобразований не делает. В зависимости от используемого текстового редактора, строки могут быть разделены пустой строкой.

Изменение режима передачи в FileZilla


В FileZilla вы можете изменить режим передачи данных тремя способами:
  • В настройках FileZilla
  • В главном меню Transfer -> Transfer type
  • Правым кликом по индикатору режима передачи в статус-баре FileZilla.

Комментариев нет:

Отправить комментарий