无法生成派生图像


8

今天,我将网站上传到服务器,但出现如下错误:

无法生成位于public://styles/sponsor_image/public/TerraThermaSponsorLogo.png的派生图像。

图像样式无法生成图像。我尝试使用来设置styles / *文件夹的权限chmod -R 775 styles/,甚至尝试过chmod -R 777 styles/。文件夹的所有者是确定的。我不明白什么是错的。

与public://关联的目录是sites / default / files,并且可以。

Answers:


5

简而言之,每当遇到此问题时,我都会这样做:

将用户更改为运行您的Web服务器的服务器(apache,httpd,www-data,nginx等)

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

cd直接将文件目录,并尝试随机数据写入到一个新的文件。

echo "Random text" > some_file_name

通常这将失败,并且您会从操作系统中收到一条错误消息,至少可以将问题从Drupal中移出。如果此方法无法正常工作,则说明存在文件权限问题。这个问题可能会有所帮助:建议的目录权限是什么?


是的,您是对的,我什么都不能写:/
Petro Popelyshko

1
然后,您仍然遇到文件系统级别的权限问题。猜测是您的目录靠近不允许Web服务器写入的根目录。但是,这是一些非竞争性论坛的主题,因为我们现在要处理各种文件系统和操作系统特定的问题。您至少知道该问题现在不在Drupal中。:)
Letharion 2012年

我可以写成www-data,但是仍然会收到错误消息。我还要做什么?ImageMagick配置正确,我正在具有许多Drupal安装的服务器上运行它。
nnyby

@nnyby那时,我实际上不确定下一步该怎么做。我唯一能想到的就是从发生错误的源代码开始进行挖掘。
Letharion

我解决了这个问题-那是Drupal寻找的图像文件实际上不存在,并且错误消息令人误解。
nnyby 2014年

9

您还应该确保在服务器上确实安装了图形库(例如php-gd):检查/ admin / config / media / image-toolkit(D7)。


1
迁移到另一台服务器后,我得到了这个错误,当然我忘了去apt-get php5-gd ;-)
TheSquad 2014年

5

该错误来自图像模块(核心),其逻辑如下所示:

$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无法通过应用所有图像效果生成图像导数并保存所生成图像的缓存版本时,就会发生错误。


重现问题(用于诊断目的)的最简单方法是匆忙完成。

  1. 直接从drush调用image_style_create_derivative():

    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"

    如果您无权访问Shell,请使用Devel模块,然后转到/devel/php并粘贴PHP代码。

    注意:如果该files文件夹归Apache用户所有,则应以该用户身份登录以进行测试。否则,在drush命令前加上sudo -u www-data

  2. 存在以下可能性。

    • 上面的测试已经成功完成(文件已​​经在您的文件目录中成功生成),如果是这样,请检查日志中的失败图片是否确实存在,是否已将其从服务器中删除。
    • 如果您有相同的错误消息,或者未创建文件,则说明您的权限存在问题或缺少库(请检查:)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用户身份运行整个命令。


4

这也可能是由于没有libjpeg编译PHP而导致的(如果无法生成的映像具有jpeg源)。检查的输出gd_info()以查看是否支持PHP。


3
可以从命令行快速打印:php -r'print_r(gd_info());'
拉脱维亚2014年

这绝对是我的问题。(感谢@latvian的快速cmd引用。)
trimbletodd 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.