Não foi possível gerar a imagem derivada

8

Hoje, carreguei meu site no servidor e recebo erros como o seguinte:

Não foi possível gerar a imagem derivada localizada em public: //styles/sponsor_image/public/TerraThermaSponsorLogo.png.

Os estilos de imagem não podem gerar imagens. Eu tentei definir permissões em pastas de estilos / * chmod -R 775 styles/e até tentei chmod -R 777 styles/. O proprietário da pasta está OK. Eu não entendo o que pode estar errado.

O diretório associado a public: // é sites / default / files e está OK.

Petro Popelyshko
fonte

Respostas:

5

Resumidamente, é isso que faço sempre que tenho esse problema:

Mude o usuário para aquele que executa o seu servidor web (apache, httpd, www-data, nginx etc)

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

e cddiretamente no diretório de arquivos e tente gravar dados aleatórios em um novo arquivo.

echo "Random text" > some_file_name

Geralmente, isso irá falhar e você receberá uma mensagem de erro do sistema operacional, movendo o problema para fora do Drupal. Se isso não funcionar, você tem um problema de permissão de arquivo. Esta pergunta pode ser útil: Quais são as permissões de diretório recomendadas?

Letharion
fonte
sim você está certo, eu não posso escrever nada: /
Petro Popelyshko
11
Você ainda tem um problema de permissões no nível do sistema de arquivos. Um palpite é que você tem diretórios mais próximos da raiz em que o servidor da Web não tem permissão para gravar. Esse é o tópico para alguns fóruns não-drupais, já que agora temos todos os tipos de problemas específicos do sistema de arquivos e do sistema operacional. Você pelo menos sabe que o problema não está no Drupal agora. :)
Letharion
Eu posso escrever algo como www-data, mas ainda recebo o erro. O que mais eu faço? O ImageMagick está configurado corretamente, estou executando isso em um servidor que possui muitas instalações do Drupal.
nnyby
@ nnyby Nesse ponto, não tenho certeza do que fazer a seguir. A única coisa que consigo pensar é começar a digitar o código-fonte onde o erro ocorre.
Letharion
Resolvi o problema - os arquivos de imagem que Drupal estava procurando não existiam e a mensagem de erro era enganosa.
usar o seguinte comando
9

Você também deve ter uma biblioteca gráfica (como php-gd) instalada em seu servidor: verifique / admin / config / media / image-toolkit (D7).

Julien
fonte
11
Depois de migrar para outro servidor eu tenho esse erro, Claro que eu esqueci de apt-get php5-gd ;-)
TheSquad
5

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.

  1. 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.pngpela 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/phpe cole o código PHP lá.

    Nota: Se a filespasta 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.

  2. 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-datapara executar o comando inteiro como usuário do Apache.

kenorb
fonte
4

Isso também pode ser causado pela compilação do PHP sem libjpeg (se as imagens que não serão geradas tiverem fontes jpeg). Verifique a saída de gd_info()para ver se há suporte ao PHP.

Adam DiCarlo
fonte
3
para imprimir rapidamente da linha de comando: php -r 'print_r (gd_info ());'
letão 27/03
Esse foi definitivamente o meu problema. (E graças @latvian para o cmd ref rápido.)
trimbletodd