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.
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.png
das 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/php
und fügen Sie dort den PHP-Code ein.
Hinweis: Wenn der files
Ordner 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
.
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.