Delphi. Отправка файла чанками по HTTP протоколу. Компоненты TPS_ChunkUploader и TPS_HTTPFileServerAddon

Решил оформить предыдущие труды по отправке файла на HTTP сервер чанками в виде компонент ( и клиентская и серверная части созданы от TComponent) и немного упорядочить код и сделать его более прозрачным и понятным. Не знаю, насколько это у меня получилось, но попробовал. Также добавил юнит-тестов. Даже пробовал делать все в стиле TDD, но не крут я пока для этого подхода. Что же, будем учиться.

Зачем отправлять файл чанками?

Насколько я понял из общения со своим другом программистом, это нужно для того, чтобы повысить устойчивость передачи файла. Скажем, если произошел обрыв или произошло что-то ещё, чтобы не начинать отправку большого файла сначала.

Вообще тут что то вроде баланса между скоростью и устойчивостью. Можно отправлять файл целиком, но устойчивость тут никакая, а можно отправлять очень маленькими кусочками, но тогда скорость никакая. Это тема отдельных тестов.

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

Текущая версия просто делит файл на чанки заданного размера, отправляет их один за одним на сервер. Я всё же придерживаюсь последовательной передачи, потому как если лить в несколько потоков, да ещё несколько юзеров — может случиться out of memory или другого ресурса.

К текущему моменту я понял как важна атомарность в программировании, чтобы каждый отдельный компонент, модуль делал только одну свою маленькую функцию. Раньше лепил все подряд и код получался кашевидным) Поэтому в TPS_ChunkUploader только отправка на сервер. И несколько основных событий, то есть вот так…

6

Лучше всего тестировать в отдельном потоке — все преимущества многопоточного программирования так сказать — ничего не висит, файл, даже если большой — просто передается. А первые 2 кнопки отправляют файл в основном потоке.

Справа как вы видите обработка событий, не всех, но об этом позже. Читать далее «Delphi. Отправка файла чанками по HTTP протоколу. Компоненты TPS_ChunkUploader и TPS_HTTPFileServerAddon»

Delphi. Компонент DBGalleryViewer

Вот так он выглядит в тестовой программе. Работает поверх MySQL, переписать под другую базу, думаю, не составить труда. Основная цель — просмотреть файлы конкретного пользователя на сервере и что-то сделать с выделенными элементами.

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

65

Автоматическое перестроение при Resize

66

Читать далее «Delphi. Компонент DBGalleryViewer»

Delphi. Мои компоненты. Компонент idHTTPClient. Отправка файлов по HTTP протоколу чанками, удаление файлов, отображение через базу данных

Данный компонент для загрузки на сервер файлов, отображения файлов, удаления, поиска, сортировки и так далее. Пользователь, в некотором документе хочет добавить файл — открывается клиент этого компонента — он видит те файлы, которые он уже загрузил ранее, и может загрузить ещё.  Компонент работает поверх базы MySQL. В итоге пользователь вставляет файл в документ. Само событие вставки я пока не сделал, но там ничего сложного, это уже как поставить флаг, когда забрался на Эльбрус.

Самое сложное здесь было реализация отправки файлов чанками в разных потоках. Я ограничил максимально возможное одновременное число отправляемых файлов в потоках пятью. Размер чанка установил в 4 мб. Размер загружаемого файла никак не ограничивал. Тестировал с 2,7 Гб, все успешно.

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

Клиент

31

29

Сервер

26

Исходники

Читать далее «Delphi. Мои компоненты. Компонент idHTTPClient. Отправка файлов по HTTP протоколу чанками, удаление файлов, отображение через базу данных»