Tidak dapat menghasilkan gambar yang diturunkan

8

Hari ini saya mengunggah situs saya ke server, dan saya mendapatkan kesalahan seperti berikut:

Tidak dapat membuat gambar turunan yang terletak di publik: //styles/sponsor_image/public/TerraThermaSponsorLogo.png.

Gaya gambar tidak dapat menghasilkan gambar. Saya telah mencoba mengatur izin pada styles / * folder dengan chmod -R 775 styles/, dan bahkan mencoba chmod -R 777 styles/. Pemilik folder tidak apa-apa. Saya tidak mengerti apa yang salah.

Direktori yang terkait dengan publik: // adalah situs / default / file, dan tidak apa-apa.

Petro Popelyshko
sumber

Jawaban:

5

Secara singkat, inilah yang saya lakukan setiap kali saya memiliki masalah ini:

Ubah pengguna menjadi pengguna yang menjalankan server web Anda (apache, httpd, www-data, nginx dll)

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

dan cdlangsung ke direktori file, dan mencoba menulis data acak ke file baru.

echo "Random text" > some_file_name

Biasanya ini akan gagal dan Anda akan mendapatkan pesan kesalahan dari OS, mengeluarkan masalah setidaknya dari Drupal. Jika ini gagal berfungsi, Anda memiliki masalah izin file. Pertanyaan ini mungkin bermanfaat: Apa izin direktori yang disarankan?

Pelajaran
sumber
ya Anda benar, saya tidak bisa menulis apa pun: /
Petro Popelyshko
1
Maka Anda masih memiliki masalah izin tingkat sistem file. Dugaan Anda adalah bahwa Anda memiliki direktori yang lebih dekat dengan root yang tidak diizinkan untuk ditulis oleh server web. Itulah topik untuk beberapa forum non-drupal, karena kami sekarang memiliki semua jenis sistem file dan masalah khusus sistem operasi untuk ditangani. Anda setidaknya tahu bahwa masalahnya bukan di Drupal sekarang. :)
Letharion
Saya dapat menulis sesuatu www-data, tetapi saya masih mendapatkan kesalahan. Apa lagi yang harus saya lakukan? ImageMagick dikonfigurasi dengan benar, saya menjalankan ini pada server yang memiliki banyak instalasi Drupal.
nnyby
@nnyby Pada titik itu, saya sebenarnya tidak yakin apa yang harus dilakukan selanjutnya. Satu-satunya yang tersisa yang dapat saya pikirkan adalah mulai menggali kode sumber di mana kesalahan terjadi.
Letharion
Saya memecahkan masalah - itu adalah file gambar yang Drupal cari sebenarnya tidak ada, dan pesan kesalahannya menyesatkan.
nnyby
9

Anda juga harus memastikan Anda memiliki pustaka grafis (seperti php-gd) yang terinstal di server Anda: cek / admin / config / media / image-toolkit (D7).

Julien
sumber
1
Setelah bermigrasi ke server lain saya mendapatkan kesalahan ini, Tentu saja saya lupa untuk apt-get php5-gd ;-)
TheSquad
5

Kesalahan berasal dari modul Gambar (inti) dan logikanya terlihat seperti:

$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));
  ...
}

Oleh karena itu kesalahan terjadi ketika Drupal memiliki masalah dengan menghasilkan turunan gambar dengan menerapkan semua efek gambar dan menyimpan versi cache dari gambar yang dihasilkan.


Cara termudah mereproduksi masalah (untuk tujuan diagnosa) adalah dengan drush.

  1. Aktifkan image_style_create_derivative () langsung dari drush:

    drush -v eval 'image_style_create_derivative(reset(@image_styles()), "public://pictures/picture-123.png", "public://styles/test/test-success.png");

    Ganti picture-123.pngdengan gambar yang ada dari log:

    Tidak dapat menghasilkan gambar turunan yang terletak di publik: //styles/foo/public/pictures/picture-x.png

    Atau gunakan yang sudah ada lainnya, mis drush sqlq "SELECT * FROM file_managed".

    Jika Anda tidak memiliki akses ke shell, gunakan modul Devel, buka /devel/phpdan tempel kode PHP di sana.

    Catatan: Jika filesfolder tersebut dimiliki oleh pengguna Apache, Anda harus masuk sebagai pengguna ini untuk tujuan pengujian. Atau awali dengan perintah drush Anda sudo -u www-data.

  2. Ada beberapa kemungkinan berikut.

    • Tes di atas telah berhasil (file telah berhasil dihasilkan di dir file Anda), jika demikian, periksa apakah gambar Anda yang gagal dari log benar-benar ada, mungkin dihapus dari server.
    • Jika Anda memiliki pesan kesalahan yang sama atau file tidak dibuat, maka ada masalah dengan izin Anda atau pustaka yang hilang (periksa:) drush eval "print_r(gd_info());".
    • Jika Anda tidak memiliki kesalahan dan file tidak dibuat, maka periksa apakah Anda menggunakan file yang ada benar.

Masalah izin debug dapat dengan mudah dicapai oleh strace. Instal dan awali saja perintah yang sedang Anda uji strace -f(Anda tidak harus root).

Sebagai contoh:

$ 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)

Jika Anda masuk dengan akun berbeda yang memiliki files, maka jangan lupa untuk awalan dengan perintah drush Anda sudo -u www-datauntuk menjalankan seluruh perintah sebagai pengguna Apache.

kenorb
sumber
4

Ini juga dapat disebabkan oleh PHP yang dikompilasi tanpa libjpeg (jika gambar yang tidak menghasilkan memiliki sumber jpeg). Periksa output gd_info()untuk melihat apakah ada dukungan PHP.

Adam DiCarlo
sumber
3
untuk dengan cepat mencetak dari baris perintah: php -r 'print_r (gd_info ());'
latvian
Ini jelas merupakan masalah saya. (Dan terima kasih @latvian untuk ref cmd cepat.)
trimbletodd