派生画像を生成できません


8

今日、私は自分のサイトをサーバーにアップロードしましたが、次のようなエラーが発生します。

public://styles/sponsor_image/public/TerraThermaSponsorLogo.pngにある派生画像を生成できません。

画像スタイルは画像を生成できません。styles / *フォルダーにアクセス許可を設定chmod -R 775 styles/しようとしましたchmod -R 777 styles/。フォルダの所有者はOKです。何が悪いのかわかりません。

public://に関連付けられているディレクトリは、sites / default / filesであり、問​​題ありません。

回答:


5

簡単に言えば、これは私がこの問題を抱えているときはいつも私がすることです:

ユーザーをWebサーバーを実行しているユーザー(apache、httpd、www-data、nginxなど)に変更します。

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

そしてcd直接filesディレクトリに行き、ランダムなデータを新しいファイルに書き込もうとします。

echo "Random text" > some_file_name

通常、これは失敗し、OSからエラーメッセージが表示され、少なくともDrupalから問題が解決されます。これが機能しない場合は、ファイル権限の問題があります。この質問は役に立ちます:推奨されるディレクトリ権限は何ですか?


はい、そうです、私は何も書くことができません:/
Petro Popelyshko

1
次に、ファイルシステムレベルのアクセス許可の問題が引き続き発生します。推測では、Webサーバーが書き込みを許可されていないルートに近いディレクトリがあります。しかし、現在、あらゆる種類のファイルシステムとオペレーティングシステム固有の問題に対処する必要があるため、Drupal以外のフォーラムのトピックです。あなたは少なくとも問題が今Drupalにないことを知っています。:)
Letharion

として何かを書くことができますwww-dataが、それでもエラーが発生します。他に何をしますか?ImageMagickは正しく構成されています。これは、Drupalが多数インストールされているサーバーで実行しています。
nnyby 14

@nnybyその時点で、私は実際に次に何をするかわかりません。私が考えることができる唯一残っていることは、エラーが発生するソースコードを掘り始めることです。
Letharion 2014

私は問題を解決しました-それはDrupalが探していた画像ファイルが実際には存在しなかったことであり、エラーメッセージは誤解を招くものでした。
nnyby 2014

9

また、サーバーにグラフィカルライブラリ(php-gdなど)がインストールされていることを確認してください。/admin/config/media/image-toolkit(D7)を確認してください。


1
別のサーバーに移行した後、このエラーが発生しました。もちろん、apt-get php5-gdを忘れていました;-)
TheSquad

5

エラーは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を使用することです。

  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"

    シェルにアクセスできない場合は、Develモジュールを使用して/devel/php、そこにPHPコードを貼り付けます。

    注:filesフォルダーがApacheユーザーによって所有されている場合、テスト目的でこのユーザーとしてログインする必要があります。それ以外の場合は、drushコマンドの前にを付けますsudo -u www-data

  2. 以下の可能性があります。

    • 上記のテストは成功しました(ファイルがファイルdirに正常に生成されました)。その場合、ログからの失敗した画像が実際に存在するかどうかを確認します。サーバーから削除された可能性があります。
    • 同じエラーメッセージが表示されるか、ファイルが作成されなかった場合は、アクセス権に問題があるか、ライブラリが不足しています(チェック:)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

これは、PHPがlibjpegなしでコンパイルされている場合にも発生します(生成されないイメージにjpegソースがある場合)。の出力をチェックして、gd_info()PHPサポートがあるかどうかを確認します。


3
コマンドラインからすばやく印刷するには:php -r 'print_r(gd_info());'
ラトビア2014年

これは間違いなく私の問題でした。(そして、迅速なcmd参照に対して@latvianに感謝します。)
trimbletodd 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.