Extraire les photos produits PrestaShop : SQL, cURL et bonnes pratiques
Guide complet pour extraire les images produits PrestaShop via requête SQL et cURL. Méthode professionnelle compatible PrestaShop 1.7 et 8.x.
En bref : Pour extraire les photos produits de PrestaShop, reconstituez les URLs des images via une requête SQL sur la table ps_image (en découpant l'id_image en sous-dossiers), puis téléchargez-les en masse avec cURL ou rsync.
Pourquoi extraire les images produits de PrestaShop ?
Plusieurs situations exigent de récupérer en masse les photos originales de votre catalogue PrestaShop : migration vers une autre plateforme, sauvegarde externe, alimentation d'un PIM (Product Information Management) ou synchronisation avec une marketplace.
Le problème, c'est que PrestaShop stocke ses images dans une arborescence éclatée sur le disque. Depuis la version 1.6.1, le nouveau mode de stockage découpe l'identifiant de chaque image en sous-dossiers individuels. L'image 12345.jpg se retrouve ainsi dans /img/p/1/2/3/4/5/12345.jpg. Impossible donc de simplement copier un dossier unique.
Voici la méthode professionnelle en deux étapes : d'abord reconstituer les URLs via SQL, puis télécharger en masse avec cURL.
Comprendre le stockage des images PrestaShop
Ancien format (legacy)
Dans les anciennes versions (avant 1.6.1), toutes les images étaient stockées à plat :
/img/p/12345.jpg
/img/p/12345-home_default.jpg
/img/p/12345-large_default.jpg
Nouveau format (arborescence éclatée)
Depuis PrestaShop 1.6.1, chaque chiffre de l'identifiant devient un sous-dossier :
/img/p/1/2/3/4/5/12345.jpg → image originale
/img/p/1/2/3/4/5/12345-home_default.jpg → miniature
/img/p/1/2/3/4/5/12345-large_default.jpg → grande taille
Ce format améliore les performances sur les systèmes de fichiers (évite les dossiers contenant des milliers de fichiers), mais complique l'extraction manuelle.
Vous pouvez vérifier quel mode est actif dans votre back-office sous Préférences > Images > Utiliser le nouveau système de stockage d'images.
Étape 1 : Reconstituer les URLs via SQL
La clé de l'extraction est de reconstruire le chemin complet de chaque image à partir de son id_image en base de données. Voici une requête SQL optimisée à exécuter dans le Gestionnaire SQL du back-office (ou via phpMyAdmin) :
SELECT
p.id_product AS id,
pl.name AS nom_produit,
im.id_image,
CONCAT(
'https://www.votredomaine.fr/img/p/',
CONCAT_WS('/',
SUBSTRING(im.id_image, 1, 1),
CASE WHEN LENGTH(im.id_image) >= 2 THEN SUBSTRING(im.id_image, 2, 1) END,
CASE WHEN LENGTH(im.id_image) >= 3 THEN SUBSTRING(im.id_image, 3, 1) END,
CASE WHEN LENGTH(im.id_image) >= 4 THEN SUBSTRING(im.id_image, 4, 1) END,
CASE WHEN LENGTH(im.id_image) >= 5 THEN SUBSTRING(im.id_image, 5, 1) END,
CASE WHEN LENGTH(im.id_image) >= 6 THEN SUBSTRING(im.id_image, 6, 1) END
),
'/', im.id_image, '.jpg'
) AS url_image
FROM ps_product p
INNER JOIN ps_product_lang pl
ON p.id_product = pl.id_product AND pl.id_lang = 1
INNER JOIN ps_image im
ON p.id_product = im.id_product
WHERE p.active = 1
ORDER BY p.id_product, im.position;
Note : Remplacez
ps_par votre préfixe de tables si vous l'avez personnalisé lors de l'installation. Adaptez égalementid_lang = 1selon votre langue par défaut.
Variante : exporter toutes les déclinaisons de taille
Si vous souhaitez récupérer une taille spécifique (par exemple large_default), modifiez la fin de la concaténation :
-- Remplacer la ligne finale par :
'/', im.id_image, '-large_default.jpg'
Les types d'images disponibles correspondent à ceux configurés dans Préférences > Images : cart_default, small_default, medium_default, home_default, large_default, etc.
Exporter le résultat en CSV
Depuis le Gestionnaire SQL, cliquez sur Exporter pour obtenir un fichier CSV contenant toutes les URLs. Vous pouvez aussi exporter directement en ligne de commande :
mysql -u votre_user -p votre_base \
-e "SELECT ... (votre requête)" \
--batch --raw > urls_images.csv
Étape 2 : Télécharger en masse avec cURL
cURL est l'outil idéal pour télécharger ces images de manière automatisée. Voici un script Bash complet :
#!/bin/bash
# Extraction en masse des images produits PrestaShop
# Usage : ./extract-images.sh urls_images.csv ./output/
INPUT_FILE="$1"
OUTPUT_DIR="${2:-./images_produits}"
mkdir -p "$OUTPUT_DIR"
# Ignorer la première ligne (en-tête CSV)
tail -n +2 "$INPUT_FILE" | while IFS=$'\t' read -r id nom id_image url; do
if [ -n "$url" ]; then
# Créer un sous-dossier par produit
PRODUCT_DIR="$OUTPUT_DIR/product_${id}"
mkdir -p "$PRODUCT_DIR"
FILENAME=$(basename "$url")
echo "Téléchargement : $nom (image $id_image)"
curl -sS -o "$PRODUCT_DIR/$FILENAME" "$url" \
--retry 3 \
--max-time 30
fi
done
echo "Extraction terminée dans $OUTPUT_DIR"
Alternative rapide avec xargs (parallélisation)
Pour accélérer considérablement le téléchargement sur un gros catalogue :
# Extraire uniquement la colonne URL du CSV
cut -f4 urls_images.csv | tail -n +2 > urls_only.txt
# Télécharger 10 images en parallèle
xargs -n 1 -P 10 curl -sS -O < urls_only.txt
Méthode alternative : accès direct au système de fichiers
Si vous avez un accès SSH ou FTP au serveur, vous pouvez copier directement le dossier /img/p/ dans son intégralité :
# Via rsync (recommandé — reprend en cas d'interruption)
rsync -avz user@serveur:/var/www/prestashop/img/p/ ./backup_images/
# Via SCP
scp -r user@serveur:/var/www/prestashop/img/p/ ./backup_images/
Cette approche récupère toutes les déclinaisons (toutes les tailles). Comptez environ 5 à 10 fois le poids des images originales selon le nombre de types configurés.
Redimensionnement et types d'images
PrestaShop redimensionne automatiquement chaque image uploadée selon les types définis dans Préférences > Images. Chaque type génère une copie à la taille configurée.
Si votre problème n'est pas d'extraire les images mais simplement d'obtenir une taille différente, il suffit de :
- Aller dans **Préférences > Images**
- Modifier les dimensions du type souhaité (ou en créer un nouveau)
- Cliquer sur **Régénérer les miniatures**
- **Sauvegardez les originaux** : PrestaShop conserve l'image d'origine (sans suffixe de type). C'est celle-ci qu'il faut extraire en priorité pour toute migration.
- **Vérifiez le format** : les images peuvent être en `.jpg`, `.png`, `.gif` ou `.webp` (PS 8.x). Adaptez votre requête SQL si nécessaire.
- **Utilisez WebP en PrestaShop 8.x** : le format WebP est nativement supporté et réduit le poids des images de 25 à 35 %. Activez-le dans **Préférences > Images > Générer des images au format WebP**.
- **Nommez proprement vos fichiers** : si vous réimportez les images ailleurs, renommez-les avec le nom du produit pour le SEO (`chaise-scandinave-bleue.jpg` plutôt que `12345.jpg`).
Attention sur PrestaShop 8.x : La régénération de miniatures sur un catalogue volumineux (> 5000 produits) peut provoquer un timeout. Privilégiez la commande CLI :
# PrestaShop 8.x — régénération via console
php bin/console prestashop:image:regenerate --type=products
Bonnes pratiques pour la gestion des images
Questions fréquentes
Tout ce que vous devez savoir sur ce sujet.
Un projet PrestaShop ?
Discutons-en directement.
193 projets livrés
Lire sur le blog

Alexandre Carette
Expert PrestaShop & Architecture E-commerce
Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.