No se puede generar la imagen derivada

8

Hoy he subido mi sitio al servidor y recibo errores como los siguientes:

No se puede generar la imagen derivada ubicada en public: //styles/sponsor_image/public/TerraThermaSponsorLogo.png.

Los estilos de imagen no pueden generar imágenes. Intenté establecer permisos en estilos / * carpetas con chmod -R 775 styles/, e incluso intenté chmod -R 777 styles/. El propietario de la carpeta está bien. No entiendo qué puede estar mal.

El directorio asociado con public: // es sites / default / files, y está bien.

Petro Popelyshko
fuente

Respuestas:

5

Brevemente, esto es lo que hago cuando tengo este problema:

Cambie el usuario al que ejecuta su servidor web (apache, httpd, www-data, nginx, etc.)

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

y cddirectamente al directorio de archivos, e intente escribir datos aleatorios en un nuevo archivo.

echo "Random text" > some_file_name

Por lo general, esto fallará y recibirá un mensaje de error del sistema operativo, lo que al menos eliminará el problema de Drupal. Si esto no funciona, tiene un problema de permisos de archivos. Esta pregunta puede ser útil: ¿Cuáles son los permisos de directorio recomendados?

Letharion
fuente
sí, tienes razón, no puedo escribir nada: /
Petro Popelyshko
1
Entonces todavía tiene un problema de permisos a nivel de sistema de archivos. Supongo que tiene directorios más cercanos a la raíz en los que el servidor web no puede escribir. Sin embargo, ese es el tema de algunos foros que no son de Drupal, ya que ahora tenemos que tratar con todo tipo de problemas específicos del sistema de archivos y del sistema operativo. Al menos sabes que el problema no está en Drupal ahora. :)
Letharion
Puedo escribir algo como www-data, pero aún recibo el error. ¿Qué más hago? ImageMagick está configurado correctamente, lo estoy ejecutando en un servidor que tiene muchas instalaciones de Drupal.
nnyby
@nnyby En ese momento, no estoy seguro de qué hacer a continuación. Lo único que puedo pensar es comenzar a cavar en el código fuente donde se produce el error.
Letharion
Resolví el problema: era que los archivos de imagen que Drupal estaba buscando en realidad no existían y el mensaje de error era engañoso.
nnyby
9

También debe asegurarse de tener una biblioteca gráfica (como php-gd) instalada en su servidor: consulte / admin / config / media / image-toolkit (D7).

Julien
fuente
1
Después de migrar a otro servidor, recibí este error, por supuesto, olvidé apt-get php5-gd ;-)
TheSquad
5

El error proviene del módulo de imagen (núcleo) y la lógica se ve así:

$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));
  ...
}

Por lo tanto, el error ocurre cuando Drupal tiene problemas para generar una derivada de la imagen aplicando todos los efectos de la imagen y guardando una versión en caché de la imagen resultante.


La forma más fácil de reproducir el problema (para fines de diagnóstico) es mediante borrado.

  1. Invoque image_style_create_derivative () directamente desde drush:

    drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");

    Reemplace picture-123.pngcon la imagen existente del registro:

    No se puede generar la imagen derivada ubicada en público: //styles/foo/public/pictures/picture-x.png

    O use cualquier otro existente, por ejemplo drush sqlq "SELECT * FROM file_managed".

    Si no tiene acceso a shell, use el módulo Devel, vaya /devel/phpy pegue el código PHP allí.

    Nota: Si la filescarpeta es propiedad de un usuario de Apache, debe iniciar sesión como este usuario con fines de prueba. De lo contrario, prefija su comando drush con sudo -u www-data.

  2. Existen las siguientes posibilidades.

    • La prueba anterior ha sido satisfactoria (el archivo se ha generado correctamente en el directorio de archivos). Si es así, verifique si su imagen defectuosa del registro realmente existe, tal vez se eliminó del servidor.
    • Si tiene el mismo mensaje de error o el archivo no fue creado, entonces es un problema con su permiso o las bibliotecas faltantes (marque:) drush eval "print_r(gd_info());".
    • Si no tiene ningún error y el archivo no se creó, verifique si utilizó los archivos existentes correctos.

Los problemas de permisos de depuración se pueden lograr fácilmente mediante strace. Instálelo y simplemente prefija cualquier comando con el que esté probando strace -f(no tiene que ser root).

Por ejemplo:

$ 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)

Si ha iniciado sesión con una cuenta diferente que posee files, no olvide prefijar su comando drush sudo -u www-datapara ejecutar todo el comando como usuario de Apache.

kenorb
fuente
4

Esto también puede deberse a que PHP se compila sin libjpeg (si las imágenes que no se generarán tienen fuentes jpeg). Verifique la salida de gd_info()para ver si hay soporte PHP.

Adam DiCarlo
fuente
3
imprimir rápidamente desde la línea de comandos: php -r 'print_r (gd_info ());'
letón
Este fue definitivamente mi problema. (Y gracias @latvian por el rápido cmd ref.)
trimbletodd