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

10

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

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

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

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

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

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

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

6

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

Справа как вы видите обработка событий, не всех, но об этом позже. Continue reading

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

67

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

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

65

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

66

Continue reading

Delphi. FireDAC добавление параметров в запрос. Шпаргалочка

64

Добавляем параметр в FDQuery,

Допустим у нас есть запрос, скажем такой

И нам нужно добавить параметр users_id в FDQuery.

Визуальный подход

Вообще говоря, если вставить этот запрос в визуальный редактор FDQuery, то параметр обнаружится сам

63

Единственное, надо будет указать его DataType в соответствии с базой

Программный подход

Continue reading

Delphi. Алгоритмы. Галерея своими руками или как выложить плитками фрэйм

62

Давно хотел записать это, так как часто пригождается, думаю транслировать на другие языки не составит труда. Итак, вот что у нас получится…

61

Я пока не стал выкладывать никакие картинки, просто хочу здесь описать саму логику алгоритма. Сам алгоритм я взял в книге Дмитрия Осипова по FireMonkey и немного адаптировал под свою задачу.

Итак, пусть есть N картинок заданного размера. Я создал отдельный объект фиксированного размера TPictureFrame и им выложил галерею так, чтобы если плитка не входит – она перемещалась бы на следующий ряд. Саму плитку раскрасил белым и окантовал серым.

Алгоритм выкладывания плиток

Continue reading

Алгоритмы. Delphi. C#. PHP. JS. Бинарный поиск в массивах на 4 языках

59

Продолжаем мультиязычные посты. Сегодня бинарный поиск. Все программы будут состоять из 2 частей –  рандомное заполнение массивов с сортировкой. И вторая часть – собственно бинарный поиск.

Delphi (бинарный поиск)

52

53

54

Собственно реализация

Функции бинарного поиска Integer и String массивов. Массивы предварительно отсортированы Continue reading

Delphi. Делаем простой DBPaginator на примере MySQL

50

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

47

48

Проект выглядит примерно так…

46

Исходники

385_FireDacRowsFetching

Описание кода

Как видно здесь 2 FDQuery ,один из них основной, другой просто считает число записей в таблице. SQL запрос основного FDQuery должен быть без точки с запятой на конце, так как мы должны добавить инструкцию LIMIT StartRow, CountOfRows к основному запросу. Я здесь не делал акцент на подключении, а просто забил параметры подключения в FDConnection и подключил Queries к FDConnection визуально, хотя по хорошему, надо подключать их в коде. Но хотелось сосредоточиться на другом, именно на паджинаторе. Итак, основная работа у нас происходит в uDBPagination.

Требования к запросу SQL

В принципе он может быть любым SELECTом, главное, чтобы в его конец можно было добавить инструкцию LIMIT StartRow, CountOfRows 

В моем случае это был

Функционал 

-загрузить первую страницу

-загрузить следующую страницу

-загрузить предыдущую страницу

Далее описание юнитов Continue reading

Delphi. WinAPI. CheckFileAccess – проверка прав файла на чтение / запись / исполнение и других

tukan

Под uses пишем

 

Функция из одного проекта со StackOverFlow Continue reading

Delphi. WinAPI. Получение дескриптора безопасности файла

111

Получение дескриптора безопасности файла

По мотивам обсуждения на форуме

Способ №1

Способ №2 – дает информацию не только о DACL_SECURITY_INFORMATION, но и о SID владельца объекта и группы Continue reading