Impossible de générer l'image dérivée

8

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 j'ai 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.

Petro Popelyshko
la source

Réponses:

5

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 cddirectement 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, éliminant 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?

Létharion
la source
oui vous avez raison, je ne peux rien écrire: /
Petro Popelyshko
1
Ensuite, vous avez toujours un problème d'autorisations au niveau du système de fichiers. Une supposition est que vous avez des répertoires plus proches de la racine que le serveur Web n'est pas autorisé à écrire. C'est le sujet de certains forums non drupaux, car nous avons maintenant toutes sortes de problèmes spécifiques au système de fichiers et au système d'exploitation à traiter. Vous savez au moins que le problème n'est pas dans Drupal maintenant. :)
Letharion
Je peux écrire quelque chose comme www-data, mais je reçois toujours l'erreur. Que puis-je faire d'autre? ImageMagick est configuré correctement, je l'exécute sur un serveur qui a de nombreuses installations Drupal.
nnyby
@nnyby À ce stade, je ne sais pas vraiment quoi faire ensuite. La seule chose qui me reste à penser alors est de commencer à creuser dans le code source où l'erreur se produit.
Letharion
J'ai résolu le problème - c'était que les fichiers d'image que Drupal recherchait n'existaient pas réellement, et le message d'erreur était trompeur.
nnyby
9

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).

Julien
la source
1
Après avoir migré vers un autre serveur, j'ai eu cette erreur, bien sûr, j'ai oublié d'apt-get php5-gd ;-)
TheSquad
5

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.

  1. 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.pngpar 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/phpet collez le code PHP là-bas.

    Remarque: Si le filesdossier 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.

  2. 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-datapour exécuter la commande entière en tant qu'utilisateur Apache.

kenorb
la source
4

Cela peut également être dû à la compilation de PHP 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 existe un support PHP.

Adam DiCarlo
la source
3
pour imprimer rapidement à partir de la ligne de commande: php -r 'print_r (gd_info ());'
letton
C'était définitivement mon problème. (Et merci @latvian pour la référence rapide cmd.)
trimbletodd