Impossibile generare l'immagine derivata


8

Oggi ho caricato il mio sito sul server e ricevo errori come i seguenti:

Impossibile generare l'immagine derivata disponibile in public: //styles/sponsor_image/public/TerraThermaSponsorLogo.png.

Gli stili di immagine non possono generare immagini. Ho provato a impostare le autorizzazioni per le cartelle styles / * chmod -R 775 styles/e ho persino provato chmod -R 777 styles/. Il proprietario della cartella è OK. Non capisco cosa può essere sbagliato.

La directory associata a public: // è sites / default / files ed è OK.

Risposte:


5

In breve, questo è quello che faccio ogni volta che ho questo problema:

Cambia utente a quello che esegue il tuo server web (apache, httpd, www-data, nginx ecc.)

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

e cddirettamente nella directory dei file e provare a scrivere dati casuali in un nuovo file.

echo "Random text" > some_file_name

Di solito questo fallirà e riceverai un messaggio di errore dal sistema operativo, spostando almeno il problema da Drupal. Se questo non funziona, hai un problema con le autorizzazioni dei file. Questa domanda può essere utile: quali sono le autorizzazioni di directory consigliate?


sì hai ragione, non posso scrivere nulla: /
Petro Popelyshko il

1
Quindi hai ancora un problema con le autorizzazioni a livello di file system. Un'ipotesi è che tu abbia directory più vicine alla radice su cui il web server non è autorizzato a scrivere. Questo è l'argomento di alcuni forum non drupal, tuttavia, poiché ora abbiamo tutti i tipi di problemi specifici del filesystem e del sistema operativo da affrontare. Almeno sai che il problema non è in Drupal ora. :)
Letharion,

Posso scrivere qualcosa come www-data, ma ottengo ancora l'errore. Cos'altro devo fare? ImageMagick è configurato correttamente, sto eseguendo questo su un server che ha molte installazioni Drupal.
nnyby,

@nnyby A quel punto, in realtà non sono sicuro di cosa fare al prossimo. L'unica cosa che mi viene in mente allora è iniziare a scavare nel codice sorgente in cui si verifica l'errore.
Letharion,

Ho risolto il problema: i file di immagine che Drupal cercava non esistevano effettivamente e il messaggio di errore era fuorviante.
nnyby,

9

Dovresti anche assicurarti di avere una libreria grafica (come php-gd) installata sul tuo server: controlla / admin / config / media / image-toolkit (D7).


1
Dopo la migrazione su un altro server ho riscontrato questo errore, ovviamente ho dimenticato di apt-get php5-gd ;-)
TheSquad

5

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.

  1. 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.pngcon 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/phpe incolla qui il codice PHP.

    Nota: se la filescartella appartiene all'utente Apache, è necessario accedere come utente a scopo di test. Altrimenti aggiungi il prefisso al comando drush sudo -u www-data.

  2. 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-dataper eseguire l'intero comando come utente Apache.


4

Ciò può anche essere causato dalla compilazione di PHP senza libjpeg (se le immagini che non generano hanno origini jpeg). Controlla l'output di gd_info()per vedere se c'è il supporto PHP.


3
per stampare rapidamente dalla riga di comando: php -r 'print_r (gd_info ());'
lettone

Questo è stato sicuramente il mio problema. (E grazie a @latvian per il rapido riferimento cmd.)
trimbletodd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.