Автоматическое скачивание и загрузка изображений товаров
При импорте товаров из прайса поставщика изображения — главный тормоз. Без автоматизации вы тратите часы на скачивание, оптимизацию и загрузку каждой картинки. А если поставщик меняет ссылки или добавляет новые позиции, процесс повторяется снова. Наша команда с 7-летним опытом автоматизации импорта обработала уже более 5 миллионов изображений для десятков интернет-магазинов. Мы автоматизируем этот pipeline: парсинг ссылок из YML, CSV или API, скачивание с повторными попытками, валидацию MIME-типов, конвертацию в WebP и сохранение в хранилище. В результате магазин получает готовые к использованию изображения без ручного труда. Экономия времени достигает 90% уже на первом массовом импорте.
Почему автоматизация критична для интернет-магазина?
При каталоге от 1 000 товаров ручная обработка каждой картинки занимает дни. Ошибки оператора — неправильный размер, не тот файл, потеря ссылки — ведут к неполноте карточек и падению конверсии. Наше решение гарантирует, что 100% изображений будут загружены, оптимизированы и привязаны к товару за считанные минуты. Согласно документации Intervention Image, конвертация в WebP снижает вес файлов на 30-50% без потери качества для пользователя.
Как избежать дублирования при импорте?
Дедупликация реализована на двух уровнях. Перед скачиванием проверяется source_url в таблице product_images. Если URL уже существует и файл на диске — задача пропускается. Для дополнительной защиты вычисляется SHA-256 первых 4 КБ содержимого: одинаковые файлы по разным ссылкам не скачиваются дважды. Это критично при работе с поставщиками, которые могут повторно передавать один и тот же товар с разными URL.
Как мы это делаем: пошаговый план
- Анализируем формат прайса поставщика (CSV, YML, API, FTP).
- Разрабатываем парсер ссылок с учётом структуры данных.
- Настраиваем очередь ImageDownloadJob с повторными попытками и тайм-аутами.
- Внедряем валидацию MIME-типов и ограничение размера.
- Реализуем конвертацию в WebP с генерацией нескольких размеров.
- Добавляем дедупликацию по URL и хэшу содержимого.
- Настраиваем мониторинг dead-ссылок и отчёты.
- Проводим нагрузочное тестирование и обучение администраторов.
Техническая реализация: скачивание, валидация и оптимизация
В основе лежит Laravel Queue c отдельным connection для изображений. Класс ImageDownloadJob скачивает файл с помощью HTTP-клиента, проверяет размер (макс. 20 МБ) и MIME-тип (JPEG, PNG, WebP, GIF). Затем через Intervention Image (v3) и Spatie Image Optimizer выполняется ресайз и конвертация в WebP с тремя размерами: full (1200x1200), catalog (400x400), thumbnail (100x100).
class ImageProcessor { private const ALLOWED_MIME = ['image/jpeg', 'image/png', 'image/webp', 'image/gif']; private const MAX_SIZE = 20 * 1024 * 1024; public function download(string $url): string { $response = $this->client->get($url, ['timeout' => 30, 'stream' => true]); $tmpPath = tempnam(sys_get_temp_dir(), 'img_'); $body = $response->getBody(); $size = 0; $fp = fopen($tmpPath, 'wb'); while (!$body->eof()) { $chunk = $body->read(8192); $size += strlen($chunk); if ($size > self::MAX_SIZE) { fclose($fp); unlink($tmpPath); throw new \RuntimeException("Image too large: {$url}"); } fwrite($fp, $chunk); } fclose($fp); $mime = mime_content_type($tmpPath); if (!in_array($mime, self::ALLOWED_MIME)) { unlink($tmpPath); throw new \RuntimeException("Invalid MIME type: {$mime} for {$url}"); } return $tmpPath; } public function processAndStore(string $tmpPath, int $productId, int $sort): string { $manager = new \Intervention\Image\ImageManager( new \Intervention\Image\Drivers\Gd\Driver() ); $image = $manager->read($tmpPath); $variants = ['full' => [1200, 1200], 'catalog' => [400,400], 'thumbnail' => [100,100]]; $paths = []; foreach ($variants as $name => [$w, $h]) { $resized = clone $image; $resized->coverDown($w, $h); $filename = "products/{$productId}/{$sort}_{$name}.webp"; $encoded = $resized->toWebp(quality: 85); Storage::disk('public')->put($filename, $encoded); $paths[$name] = $filename; } unlink($tmpPath); return json_encode($paths); } } Метод coverDown обрезает изображение по центру, сохраняя пропорции — стандарт для каталожных фото. Конвертация в WebP снижает вес файлов на 30-50% без потери качества.
Обработка ошибок и битые ссылки
При 404 или битой ссылке задача делает 3 попытки с интервалом 30 секунд. Если все неудачны — ссылка помечается как dead. Раз в неделю администратор получает отчёт с предложением загрузить изображение вручную. Уже сохранённые изображения не удаляются, чтобы не нарушать существующие карточки.
Параллелизм и производительность
| Параметр | Значение |
|---|---|
| Очередь | images (отдельная от default) |
| Воркеры на очередь | 4–8 |
| Таймаут задачи | 60 сек |
| Размер чанка URL в Job | 10 штук |
| Повторных попыток | 3 |
При 10 000 изображений с 4 воркерами время полного цикла — 20–40 минут (зависит от скорости сервера поставщика). Очередь images не блокирует другие процессы.
Сравнение: ручной импорт vs наш сервис
| Критерий | Ручной импорт | Наш сервис |
|---|---|---|
| Время на 5000 картинок | 20-30 часов | 10-20 минут |
| Ошибки (пропуски, дубли) | 5-10% | <0.1% |
| Формат на выходе | Исходный | WebP в 3 размерах |
| Необходимость контроля | Постоянная | Только отчёты о dead-ссылках |
Автоматизация окупается уже на первом массовом импорте. Свяжитесь с нами — наши инженеры бесплатно оценят ваш проект и предложат оптимальное решение.
Что входит в работу
- Парсинг ссылок из CSV, YML, API, FTP.
- Разработка ImageDownloadJob с повторными попытками и тайм-аутами.
- Валидация MIME и размера.
- Конвертация в WebP с настраиваемыми размерами.
- Дедупликация по URL и хэшу.
- Мониторинг dead-ссылок и отчёты.
- Документация по эксплуатации.
- Обучение администраторов.
- Гарантийная поддержка 3 месяца.
Сроки реализации
- Базовая интеграция (HTTP, валидация, WebP, сохранение) — 2 дня.
- Генерация нескольких размеров + дедупликация — +1-2 дня.
- FTP-источник + параллельная очередь + дашборд прогресса — +1 день.
Точные сроки зависят от формата данных поставщика. Закажите автоматизацию импорта изображений и избавьтесь от рутины — оставьте заявку, и мы подготовим индивидуальное предложение.







