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.
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.png
con 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/php
y pegue el código PHP allí.
Nota: Si la files
carpeta 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
.
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-data
para ejecutar todo el comando como usuario de Apache.