O erro vem do módulo Image (core) e a lógica se parece com:
$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));
...
}
Portanto, o erro ocorre quando o Drupal tem problemas ao gerar um derivado de imagem aplicando todos os efeitos de imagem e salvando uma versão em cache da imagem resultante.
A maneira mais fácil de reproduzir o problema (para fins de diagnóstico) é por drush.
Invoque image_style_create_derivative () diretamente do drush:
drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");
Substitua picture-123.png
pela imagem existente do log:
Não foi possível gerar a imagem derivada localizada em public: //styles/foo/public/pictures/picture-x.png
Ou use qualquer outro existente, por exemplo drush sqlq "SELECT * FROM file_managed"
.
Se você não tem acesso ao shell, use o módulo Devel, vá /devel/php
e cole o código PHP lá.
Nota: Se a files
pasta pertencer ao usuário do Apache, você deverá efetuar login como esse usuário para fins de teste. Caso contrário, prefixe seu comando drush com sudo -u www-data
.
Existem as seguintes possibilidades.
- O teste acima foi bem-sucedido (o arquivo foi gerado com êxito em seu diretório de arquivos); nesse caso, verifique se a imagem com falha do log realmente existe, talvez tenha sido removida do servidor.
- Se você tiver a mesma mensagem de erro ou o arquivo não foi criado, é um problema com sua permissão ou com a falta de bibliotecas (verifique
drush eval "print_r(gd_info());"
:).
- Se você não tiver nenhum erro e o arquivo não foi criado, verifique se você usou os arquivos existentes corretos.
Problemas de permissão de depuração podem ser facilmente alcançados por strace
. Instale-o e prefixe qualquer comando que você esteja testando strace -f
(você não precisa ser root).
No exemplo:
$ 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 você estiver conectado com uma conta diferente files
, não se esqueça de prefixar seu comando drush sudo -u www-data
para executar o comando inteiro como usuário do Apache.