Delphi. Indy. Как передать на FTP сервер несколько файлов в разных потоках?

Вот что у нас получится…

19

17

18

Скажу сразу – этот код корректно переносит файлы, но не до конца корректно отображает индикацию мультизагрузки – я так и не выяснил, с чем это связано. Потоки работают с независимыми участками кода, нигде не пересекаются.

В данном посте посмотрим как передать на FTP сервер несколько файлов в параллельных потоках (Threads). Для работы нам понадобится idFTP, FileOpenDialog с включенной в опциях функцией MultiSelect и кнопка, которая будет инициировать загрузку.

15

 

Нам понадобятся следующие модули

16

 

Как настроить сервер?

42

И чтобы не ругался Каспер, я заменил Default порт с 21 на 22

43

uFTPClient

В uses

В секции private напишем

В public

Обработка кнопки будет следующей

Модуль потока загрузки одного файла

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

Код без синхронизации – это лишь иллюстрация идеи

Несмотря на то, что я для каждого отдельного потока и соответственно idFTP прописываю процедуры onWorkBegin, OnWork, OnWorkEnd – корректно всё работает только для 1 файла. То есть, процедура put – отрабатывает на ура, а вот с визуализацией пока проблемы – это либо я что то не понимаю, либо это где то в глубинах Инди.

MultiUploadForm

Здесь ScrollBox, на который мы будем цеплять элементы, отображающие прогресс. Также таймер, который проверяет – всё ли загружено. Здесь мы ориентируемся на статусное сообщение от FTPServer.

20

 

UploadFrame

Это собственно графическая индикация для каждого отдельного файла…

21

 

 

Исходники

Скачать MyFTPClient

Выводы

Код не идеальный, но рабочий. Скорее он демонстрирует идею и подход. Я тестировал на файле 2,29 ГБ – всё работало как нужно. Файл целиком переместился на серверную часть.

Я так и не понял почему не работала визуализация для мультизагрузки в процедурах OnWorkBegin OnWorkEnd, но недолго думая, заменил её своей визуализацией через таймеры.

Можно ещё добавить проверку того – есть на сервере файл или его там нет, добавить в лабели размер файла, обработку ошибок да и много чего ещё. В дальнейших постах доработаю передачу файлов по FTP и перейду к HTTP протоколу.

This entry was posted in Delphi, Indy. Bookmark the permalink.