web-dev-qa-db-fra.com

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

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.

8
Petro Popelyshko

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?

5
Letharion

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

9
Julien

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.

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

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

5
kenorb

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.

4
Adam DiCarlo