Aujourd'hui, j'ai téléchargé mon site sur le serveur et j'obtiens des erreurs comme celles-ci:
Impossible de générer l'image dérivée située sur public: //styles/sponsor_image/public/TerraThermaSponsorLogo.png.
Les styles d'image ne peuvent pas générer d'images. J'ai essayé de définir des autorisations sur les dossiers styles/* avec chmod -R 775 styles/
, et même essayé chmod -R 777 styles/
. Le propriétaire du dossier est OK. Je ne comprends pas ce qui peut être faux.
Le répertoire associé à public: // est sites/default/files, et il est OK.
En bref, voici ce que je fais chaque fois que j'ai ce problème:
Remplacez l'utilisateur par celui qui exécute votre serveur Web (Apache, httpd, www-data, nginx, etc.)
Sudo -u [user] -s /bin/bash
et cd
directement dans le répertoire des fichiers et essayez d'écrire des données aléatoires dans un nouveau fichier.
echo "Random text" > some_file_name
Habituellement, cela échouera et vous obtiendrez un message d'erreur du système d'exploitation, déplaçant le problème de Drupal au moins. Si cela ne fonctionne pas, vous avez un problème d'autorisations de fichiers. Cette question peut être utile: Quelles sont les autorisations de répertoire recommandées?
Vous devez également vous assurer d'avoir une bibliothèque graphique (comme php-Gd) installée sur votre serveur: vérifiez/admin/config/media/image-toolkit (D7).
L'erreur provient 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-en un autre, par ex. drush sqlq "SELECT * FROM file_managed"
.
Si vous n'avez pas accès à Shell, utilisez le module Devel, accédez à /devel/php
Et collez-y le code PHP.
Remarque: Si le dossier files
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.
drush eval "print_r(Gd_info());"
).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 avec 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 compte différent qui possède 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.
Cela peut également être causé par PHP étant compilé sans libjpeg (si les images qui ne généreront pas ont des sources jpeg). Vérifiez la sortie de Gd_info()
pour voir s'il y a PHP support.