Автоматическое скачивание и загрузка изображений товаров
При импорте товаров из прайса поставщика изображения — главный тормоз. Без автоматизации вы тратите часы на скачивание, оптимизацию и загрузку каждой картинки. А если поставщик меняет ссылки или добавляет новые позиции, процесс повторяется снова. Наша команда с 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 день.
Точные сроки зависят от формата данных поставщика. Закажите автоматизацию импорта изображений и избавьтесь от рутины — оставьте заявку, и мы подготовим индивидуальное предложение.







