L'erreur vient du module Image (core) et la logique ressemble à:
$success = file_exists($derivative_uri) || image_style_create_derivative($style, $image_uri, $derivative_uri);
if ($success) {
$image = image_load($derivative_uri);
file_transfer($image->source, array('Content-Type' => $image->info['mime_type'], 'Content-Length' => $image->info['file_size']));
} else {
watchdog('image', 'Unable to generate the derived image located at %path.', array('%path' => $derivative_uri));
...
}
Par conséquent, une erreur se produit lorsque Drupal a un problème avec la génération d'un dérivé d'image en appliquant tous les effets d'image et en enregistrant une version mise en cache de l'image résultante.
La façon la plus simple de reproduire le problème (à des fins de diagnostic) est par drush.
Appelez image_style_create_derivative () directement depuis drush:
drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");
Remplacez picture-123.png
par l'image existante du journal:
Impossible de générer l'image dérivée située sur public: //styles/foo/public/pictures/picture-x.png
Ou utilisez n'importe quel autre, par exemple drush sqlq "SELECT * FROM file_managed"
.
Si vous n'avez pas accès au shell, utilisez le module Devel, allez /devel/php
et collez le code PHP là-bas.
Remarque: Si le files
dossier appartient à un utilisateur Apache, vous devez vous connecter en tant que cet utilisateur à des fins de test. Sinon, préfixez votre commande drush avec sudo -u www-data
.
Il existe les possibilités suivantes.
- Le test ci-dessus a réussi (le fichier a été généré avec succès dans votre répertoire de fichiers), si oui, vérifiez si votre image défaillante du journal existe réellement, peut-être a-t-elle été supprimée du serveur.
- Si vous avez le même message d'erreur ou si le fichier n'a pas été créé, alors c'est un problème avec votre autorisation ou des bibliothèques manquantes (vérifiez:)
drush eval "print_r(gd_info());"
.
- Si vous n'avez aucune erreur et que le fichier n'a pas été créé, vérifiez si vous avez utilisé les bons fichiers existants.
Le débogage des problèmes d'autorisation peut être facilement réalisé par strace
. Installez-le et préfixez simplement toute commande que vous testez strace -f
(vous n'avez pas besoin d'être root).
Par exemple:
$ strace -f drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://existing-image.png", "public://styles/test/test-success.png");' 2>&1 | grep "default/files"
mkdir(".../sites/default/files/styles/test", 0775) = -1 EACCES (Permission denied)
chmod(".../sites/default/files/styles/test", 0775) = -1 EPERM (Operation not permitted)
Si vous êtes connecté avec un autre compte propriétaire files
, n'oubliez pas de préfixer votre commande drush avec sudo -u www-data
pour exécuter la commande entière en tant qu'utilisateur Apache.