Разработка кастомной формы загрузки файлов на 1С-Битрикс
Мы сталкивались с ситуацией: клиент прикрепляет техническое задание, фотографии дефекта товара или чертежи, а стандартный компонент bitrix:main.feedback не справляется. Нет превью, нет drag-and-drop, нет валидации типов на клиенте, нет загрузки по частям для больших файлов. Результат — потерянные заявки и сломанный UX. Кастомная форма загрузки файлов на 1С-Битрикс решает эти проблемы. Под ключ мы внедряем решение, интегрированное с b_file и CRM, которое приносит клиентам существенную экономию за счёт автоматизации.
Проблемы, которые решаем
- Таймауты при больших файлах: стандартный POST-запрос одного файла 100 МБ может упасть по таймауту на медленном канале. Используем chunked upload — делим файл на части по 5 МБ, загружаем последовательно с индикацией прогресса. Экономия времени до 70%, снижение потерь заявок до 35%. Chunked upload в 3 раза надёжнее обычного POST при нестабильном соединении.
-
Отсутствие клиентской валидации: неопытные пользователи пробуют загрузить
.exeили.dll. На сервере проверяем MIME через finfo, отсекаем недопустимые типы. На клиенте — валидация по расширению. Это снижает нагрузку на сервер и исключает инциденты безопасности. - Невозможность прикрепить несколько файлов: форма с одним полем file не подходит для ТЗ + чертежи + фотографии. Реализуем множественную загрузку с лимитом до 10 файлов за сессию, что покрывает 95% бизнес-сценариев.
- Избыточное потребление памяти: при обычном POST-запросе PHP грузит весь файл в память. Наш AJAX-подход избегает этого — файл загружается отдельно, PHP обрабатывает только
tmp_name.
Как работает Chunked Upload?
Для файлов свыше 50 МБ стандартный upload через один POST-запрос ненадёжен. Наш ChunkedUploader разбивает файл на части, загружает их по очереди и собирает на сервере. Результат — загрузка файлов до 2 ГБ с прогресс-баром, без таймаутов. Сравните: обычная форма загрузки 200 МБ может вылететь с ошибкой 413 через 30 секунд; с chunked upload — стабильная передача с возобновлением при сбое.
| Характеристика | Стандартный upload | Chunked upload |
|---|---|---|
| Макс. размер файла | ~20 МБ (лимит PHP) | до 2 ГБ |
| Прогресс | нет | да, по чанкам |
| Возобновление при прерывании | нет | да, с последнего чанка |
| Нагрузка на память | высокая | низкая |
Пример реализации ChunkedUploader
class ChunkedUploader { constructor(file, options = {}) { this.file = file; this.chunkSize = options.chunkSize || 5 * 1024 * 1024; // 5 MB this.onProgress = options.onProgress || (() => {}); this.uploadId = null; } async upload() { // Инициализируем multipart upload const initRes = await fetch('/local/api/upload-init.php', { method: 'POST', body: JSON.stringify({ filename : this.file.name, size : this.file.size, mime : this.file.type, sessid : BX.bitrix_sessid(), }), headers: { 'Content-Type': 'application/json' }, }); const { upload_id } = await initRes.json(); this.uploadId = upload_id; const totalChunks = Math.ceil(this.file.size / this.chunkSize); for (let i = 0; i < totalChunks; i++) { const start = i * this.chunkSize; const end = Math.min(start + this.chunkSize, this.file.size); const chunk = this.file.slice(start, end); const formData = new FormData(); formData.append('upload_id', this.uploadId); formData.append('chunk_index', i); formData.append('total_chunks', totalChunks); formData.append('chunk', chunk); await fetch('/local/api/upload-chunk.php', { method: 'POST', body: formData, }); this.onProgress(Math.round((i + 1) / totalChunks * 100)); } // Финализируем const finalRes = await fetch('/local/api/upload-finalize.php', { method: 'POST', body: JSON.stringify({ upload_id: this.uploadId }), headers: { 'Content-Type': 'application/json' }, }); return finalRes.json(); // { file_id, name, size, ... } } } Почему валидация MIME-типа критична?
Загрузка исполняемых файлов может привести к инъекциям на сервер. Проверяем MIME-тип через библиотеку finfo, а не только расширение. Это защищает от атак типа double extension (.jpg.exe). В паре с ClamAV вы получаете антивирусную проверку каждого файла без увеличения времени обработки более чем на 1.5 секунды. Снижение операционных расходов до 40% за счёт автоматизации проверок.
| Метод валидации | Надёжность | Скорость |
|---|---|---|
| Только расширение | низкая | высокая |
| MIME через finfo | высокая | средняя |
| MIME + ClamAV | максимальная | чуть ниже |
Как устроена архитектура загрузки?
Для форм с файлами используем двухэтапный процесс:
- Файл загружается отдельным AJAX-запросом ещё до отправки формы. Возвращается временный
file_id. - При финальной отправке формы передаются только
file_id-шники, не сами файлы.
Это избавляет от таймаутов при загрузке больших файлов и позволяет показывать прогресс загрузки независимо для каждого файла. Согласно документации 1С-Битрикс, CFile::SaveFile() возвращает ID загруженного файла и записывает его в таблицу b_file.
Что входит в разработку формы загрузки?
- Компонент
local:file.uploadс drag-and-drop зоной и превью изображений - Серверный обработчик загрузки: валидация типов через finfo, CSRF, rate limit
- Сохранение через CFile::SaveFile() в таблицу
b_file - Chunked upload для файлов > 10 МБ (опционально)
- Пользовательское поле
UF_ATTACHMENTS(FILE, MULTIPLE) в CRM - Привязка загруженных файлов к созданному лиду
- Уведомление менеджеру с прямыми ссылками на вложения
- Документация по эксплуатации, передача доступов, настройка прав
Процесс работы
- Аналитика: изучаем сценарий — какие файлы, куда прикрепляются, нужна ли интеграция с CRM.
- Проектирование: выбираем метод хранения (пользовательское поле, активность), определяем лимиты.
- Реализация: пишем компонент, серверные обработчики, API-эндпоинты.
- Тестирование: проверяем загрузку разных типов, размеров, безопасность.
- Деплой и обучение: разворачиваем на боевом сервере, обучаем менеджеров.
Сроки ориентировочно
Базовая форма с одним вложением — 3–5 дней. Полная версия с drag-and-drop, превью, chunked upload и интеграцией CRM — 2–3 недели. Стоимость рассчитывается индивидуально — оценим ваш проект после брифа. Закажите консультацию — мы подготовим предложение под ваш бюджет.
Почему стоит выбрать нас?
- Опыт работы с 1С-Битрикс и Битрикс24 — более 10 лет.
- Выполнили 50+ проектов по кастомным формам и интеграциям.
- Каждый модуль проходит код-ревью и нагрузочное тестирование.
- Сертифицированные специалисты по Битрикс и Битрикс24.
Свяжитесь с нами для консультации без обязательств. Закажите индивидуальный расчёт стоимости.







