Das abgeleitete Bild kann nicht generiert werden

8

Heute habe ich meine Site auf den Server hochgeladen und erhalte folgende Fehler:

Das abgeleitete Bild in public: //styles/sponsor_image/public/TerraThermaSponsorLogo.png kann nicht generiert werden.

Bildstile können keine Bilder erzeugen. Ich habe versucht, Berechtigungen für Styles / * -Ordner mit festzulegen chmod -R 775 styles/, und es sogar versucht chmod -R 777 styles/. Der Besitzer des Ordners ist in Ordnung. Ich verstehe nicht, was falsch sein kann.

Das mit public: // verknüpfte Verzeichnis lautet sites / default / files und ist in Ordnung.

Petro Popelyshko
quelle

Antworten:

5

Kurz gesagt, dies ist, was ich tue, wenn ich dieses Problem habe:

Ändern Sie den Benutzer zu dem Benutzer, auf dem Ihr Webserver ausgeführt wird (Apache, httpd, www-data, nginx usw.).

sudo -u [user] -s /bin/bash

und cddirekt in das Dateiverzeichnis und versuchen Sie, zufällige Daten in eine neue Datei zu schreiben.

echo "Random text" > some_file_name

Normalerweise schlägt dies fehl und Sie erhalten eine Fehlermeldung vom Betriebssystem, die das Problem zumindest von Drupal entfernt. Wenn dies nicht funktioniert, liegt ein Problem mit den Dateiberechtigungen vor. Diese Frage kann hilfreich sein: Was sind die empfohlenen Verzeichnisberechtigungen?

Letharion
quelle
Ja, Sie haben Recht, ich kann nichts schreiben: /
Petro Popelyshko
1
Dann haben Sie immer noch ein Problem mit Berechtigungen auf Dateisystemebene. Vermutlich haben Sie Verzeichnisse näher am Stamm, in die der Webserver nicht schreiben darf. Dies ist jedoch das Thema für einige Nicht-Drupal-Foren, da wir jetzt alle Arten von Dateisystem- und Betriebssystem-spezifischen Problemen haben, mit denen wir uns befassen müssen. Sie wissen zumindest, dass das Problem jetzt nicht in Drupal liegt. :)
Letharion
Ich kann etwas schreiben als www-data, aber ich bekomme immer noch den Fehler. Was mache ich sonst noch? ImageMagick ist korrekt konfiguriert. Ich führe dies auf einem Server aus, auf dem viele Drupal-Installationen installiert sind.
Nnyby
@nnyby Zu diesem Zeitpunkt bin ich mir nicht sicher, was ich als nächstes tun soll. Das einzige, was mir dann noch einfällt, ist, den Quellcode zu durchsuchen, in dem der Fehler auftritt.
Letharion
Ich habe das Problem gelöst - es war, dass die von Drupal gesuchten Bilddateien nicht existierten und die Fehlermeldung irreführend war.
nnyby
9

Sie sollten auch sicherstellen, dass auf Ihrem Server eine grafische Bibliothek (wie php-gd) installiert ist: check / admin / config / media / image-toolkit (D7).

Julien
quelle
1
Nach der Migration auf einen anderen Server habe ich diesen Fehler erhalten, natürlich habe ich vergessen, php5-gd zu bekommen ;-)
TheSquad
5

Der Fehler kommt vom Image-Modul (Kern) und die Logik sieht wie folgt aus:

$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));
  ...
}

Daher tritt ein Fehler auf, wenn Drupal Probleme beim Generieren einer Bildableitung hat, indem alle Bildeffekte angewendet und eine zwischengespeicherte Version des resultierenden Bildes gespeichert werden.


Der einfachste Weg, das Problem (zu Diagnosezwecken) zu reproduzieren, ist Drush.

  1. Rufen Sie image_style_create_derivative () direkt von drush aus auf:

    drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");

    Durch picture-123.pngdas vorhandene Bild aus dem Protokoll ersetzen :

    Das abgeleitete Bild in der Öffentlichkeit kann nicht generiert werden: //styles/foo/public/pictures/picture-x.png

    Oder verwenden Sie eine andere vorhandene, z drush sqlq "SELECT * FROM file_managed".

    Wenn Sie keinen Zugriff auf die Shell haben, verwenden Sie das Devel-Modul, gehen Sie zu /devel/phpund fügen Sie dort den PHP-Code ein.

    Hinweis: Wenn der filesOrdner dem Apache-Benutzer gehört, sollten Sie sich zu Testzwecken als dieser Benutzer anmelden. Andernfalls stellen Sie Ihrem Drush-Befehl das Präfix vor sudo -u www-data.

  2. Es gibt folgende Möglichkeiten.

    • Der obige Test war erfolgreich (Datei wurde erfolgreich in Ihrem Dateiverzeichnis generiert). Wenn ja, überprüfen Sie, ob Ihr fehlerhaftes Bild aus dem Protokoll tatsächlich vorhanden ist. Möglicherweise wurde es vom Server entfernt.
    • Wenn Sie dieselbe Fehlermeldung haben oder die Datei nicht erstellt wurde, liegt ein Problem mit Ihrer Berechtigung oder fehlenden Bibliotheken vor (überprüfen Sie :) drush eval "print_r(gd_info());".
    • Wenn Sie keinen Fehler haben und die Datei nicht erstellt wurde, überprüfen Sie, ob Sie die richtigen vorhandenen Dateien verwendet haben.

Debugging-Berechtigungsprobleme können leicht durch gelöst werden strace. Installieren Sie es und stellen Sie einfach einen Befehl voran, mit dem Sie testen strace -f(Sie müssen nicht root sein).

Zum Beispiel:

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

Wenn Sie mit einem anderen Konto angemeldet sind, dessen Eigentümer Sie sind files, vergessen Sie nicht, Ihrem Drush-Befehl das Präfix voranzustellen sudo -u www-data, um den gesamten Befehl als Apache-Benutzer auszuführen.

Kenorb
quelle
4

Dies kann auch dadurch verursacht werden, dass PHP ohne libjpeg kompiliert wird (wenn die Bilder, die nicht generiert werden, JPEG-Quellen haben). Überprüfen Sie die Ausgabe von, gd_info()um festzustellen, ob PHP unterstützt wird.

Adam DiCarlo
quelle
3
um schnell über die Kommandozeile zu drucken: php -r 'print_r (gd_info ());'
Lettisch
Das war definitiv mein Problem. (Und danke @latvian für die schnelle cmd ref.)
trimbletodd