Ошибка исходит от модуля Image (ядро) и логика выглядит так:
$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));
...
}
Поэтому ошибка возникает, когда в Drupal возникают проблемы с генерацией производной изображения путем применения всех эффектов изображения и сохранения кэшированной версии полученного изображения.
Самый простой способ воспроизвести проблему (для целей диагностики) - это использовать метод drush.
Вызовите image_style_create_derivative () непосредственно из drush:
drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");
Заменить picture-123.png
существующей картинкой из журнала:
Невозможно сгенерировать производное изображение, расположенное по адресу public: //styles/foo/public/pictures/picture-x.png
Или используйте любой другой существующий, например drush sqlq "SELECT * FROM file_managed"
.
Если у вас нет доступа к оболочке, используйте модуль Devel, перейдите /devel/php
и вставьте туда код PHP.
Примечание. Если files
папка принадлежит пользователю Apache, вы должны войти в систему как этот пользователь для тестирования. В противном случае добавьте к вашей команде drush префикс sudo -u www-data
.
Есть следующие возможности.
- Вышеупомянутый тест был успешным (файл был успешно создан в вашей директории файлов), если это так, проверьте, действительно ли существует ваша ошибочная картинка из журнала, возможно, она была удалена с сервера.
- Если у вас такое же сообщение об ошибке или файл не был создан, значит, это проблема с вашим разрешением или отсутствующими библиотеками (проверьте:)
drush eval "print_r(gd_info());"
.
- Если у вас нет ошибок и файл не был создан, проверьте, правильно ли вы использовали существующие файлы.
Проблемы с разрешениями отладки могут быть легко достигнуты strace
. Установите его и просто введите префикс любой команды, с которой вы тестируете strace -f
(вам не нужно быть пользователем root).
В примере:
$ 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)
Если вы вошли в систему с другой учетной записью, которая владеет files
, то не забудьте добавить префикс вашей команды drush sudo -u www-data
для запуска всей команды от имени пользователя Apache.