Delphi. Как отправить файл с помощью idHTTP и принять его на idHTTPServer ?

Данный пример отправляет файлы и сообщения на сервер, а также принимает и раскодирует их.

Работал  с FTP протоколом, но столкнулся с рядом ограничений, которые  как я понял можно преодолеть при помощи HTTP протокола и которые не позволяют мне решить поставленную задачу. В частности, мне нужна была многопоточная загрузка на сервер, это возможно было только при пассивном режиме FTP сервера с открытием нескольких портов.

Я работаю с Azure и для разворачивания там FTP сервера с 1000 открытыми портами, скажем – задача нетривиальная.  Да и для безопасности это нехорошо. Все порты изначально защищены щитом из endpoints. По умолчанию endpoints открываются по одной на портале. Да и ряд других ограничений – невозможность копировать файлы на сервере, скажем, и др.

Если представить такое разворачивание одного только FTP сервера на машинах нескольких клиентов, то это адский труд))

Итак, переходим на HTTP протокол. Сегодня сделаем простую вещь – отправку файла с клиента на сервер по HTTP протоколу.

Нам понадобится idHTTPServer сервер из библиотеки Indy, а также idHTTP клиент. Для начала добьемся самого простого – отправим один файл с клиента и примем его на сервере.

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

Код довольно хорошо работает, для файлов до нескольких десятков мегабайт, но если, скажем загрузить 150 мб, то ругается на Out of Memory. Думаю, чуть позже можно организовать отправку файла частями ( так называемыми chunks). Это даже и хорошо – можно будет сделать прогресс сколько кусочков ушло, и в каком порядке – своеобразный прогресс так сказать.

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

Отправка файла

32

 

Прием файла

33

 

34

 

Начали!

Создадим обычное VCL приложение и добавим компоненты как на рисунке выше

Uses

Объявляем свой тип

Далее, в секции private формы

FormCreate и FormDestroy

 

Далее 2 вспомогательных метода – для чтения данных – понадобятся чуть позже

Чтение запроса

Как отправить файл?

Итак, для простоты разместим idHTTPServer и idHTTP на одной форме. В дальнейшем сделаем 2 отдельных программы. Кнопку Send_MultiPart обработаем следующим образом

Как принять файл?

Обработаем событие IdHTTPServerCommandGet idHTTP сервера

Исходники

368_httpserver

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