L'errore proviene dal modulo immagine (core) e la logica è simile a:
$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));
...
}
Pertanto, l'errore si verifica quando Drupal ha problemi con la generazione di una derivata dell'immagine applicando tutti gli effetti dell'immagine e salvando una versione cache dell'immagine risultante.
Il modo più semplice per riprodurre il problema (per scopi diagnostici) è tramite Drush.
Richiama image_style_create_derivative () direttamente da drush:
drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");
Sostituisci picture-123.png
con l'immagine esistente dal registro:
Impossibile generare l'immagine derivata disponibile in pubblico: //styles/foo/public/pictures/picture-x.png
O utilizzare qualsiasi altro esistente, ad es drush sqlq "SELECT * FROM file_managed"
.
Se non hai accesso alla shell, usa il modulo Devel, vai /devel/php
e incolla qui il codice PHP.
Nota: se la files
cartella appartiene all'utente Apache, è necessario accedere come utente a scopo di test. Altrimenti aggiungi il prefisso al comando drush sudo -u www-data
.
Vi sono le seguenti possibilità.
- Il test sopra riportato ha avuto esito positivo (il file è stato generato correttamente nella directory dei file), in tal caso, controlla se la tua immagine non riuscita dal registro esiste effettivamente, forse è stata rimossa dal server.
- Se hai lo stesso messaggio di errore o il file non è stato creato, allora è un problema con la tua autorizzazione o librerie mancanti (controlla:)
drush eval "print_r(gd_info());"
.
- Se non si verificano errori e il file non è stato creato, verificare se sono stati utilizzati i file esistenti corretti.
Il debugging dei problemi di autorizzazione può essere facilmente raggiunto da strace
. Installalo e aggiungi semplicemente il prefisso di qualsiasi comando che stai testando strace -f
(non devi essere root).
Per esempio:
$ 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)
Se hai effettuato l'accesso con un altro account di cui è proprietario files
, non dimenticare di aggiungere il prefisso al comando drush sudo -u www-data
per eseguire l'intero comando come utente Apache.