Si hallas alguna incompatibilidad con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.
Solución:
También debe asegurarse de tener una biblioteca gráfica (como php-gd) instalada en su servidor: verifique /admin/config/media/image-toolkit (D7).
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 imagen derivada aplicando todos los efectos de 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 drush.
-
Invoca 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");
Reemplazar
picture-123.png
con la imagen existente del registro:No se puede generar la imagen derivada ubicada en public://styles/foo/public/pictures/picture-x.png
O usar cualquier otro existente, por ejemplo
drush sqlq "SELECT * FROM file_managed"
.Si no tiene acceso al shell, use el módulo Devel, vaya a
/devel/php
y pegue el código PHP allí.Nota: Si el
files
la carpeta es propiedad del usuario de Apache, debe iniciar sesión como este usuario para fines de prueba. De lo contrario prefix tu comando drush consudo -u www-data
. -
Existen las siguientes posibilidades.
- La prueba anterior fue exitosa (el archivo se generó correctamente en el directorio de archivos), si es así, verifique si la imagen que falla del registro realmente existe, tal vez se eliminó del servidor.
- Si tiene el mismo mensaje de error o el archivo no se creó, entonces es un problema con su permiso o bibliotecas faltantes (verifique:
drush eval "print_r(gd_info());"
). - Si no tiene ningún error y el archivo no se creó, verifique si usó los archivos existentes correctos.
Los problemas de permisos de depuración se pueden lograr fácilmente mediante strace
. Instálalo y solo prefix cualquier comando con el que estés probando strace -f
(no es necesario 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 a la que posee files
, entonces no olvides prefix tu comando drush con sudo -u www-data
para ejecutar todo el comando como usuario de Apache.
Brevemente, esto es lo que hago cada vez que tengo este problema:
Cambie de usuario al que ejecuta su servidor web (apache, httpd, www-data, nginx, etc.)
sudo -u [user] -s /bin/bash
y cd
directamente 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 obtendrá un mensaje de error del sistema operativo, eliminando el problema de Drupal al menos. Si esto no funciona, tiene un problema de permisos de archivo. Esta pregunta puede ser útil: ¿Cuáles son los permisos de directorio recomendados?