Không thể tạo hình ảnh dẫn xuất


8

Hôm nay tôi đã tải trang web của mình lên máy chủ và tôi gặp các lỗi như sau:

Không thể tạo hình ảnh xuất phát ở nơi công cộng: //styles/sponsor_image/public/TerraThermaSponsorLogo.png.

Phong cách hình ảnh không thể tạo ra hình ảnh. Tôi đã cố gắng đặt quyền trên các thư mục kiểu / * chmod -R 775 styles/và thậm chí đã thử chmod -R 777 styles/. Chủ sở hữu của thư mục là OK. Tôi không hiểu những gì có thể sai.

Thư mục được liên kết với công khai: // là các trang web / mặc định / tệp và nó ổn.

Câu trả lời:


5

Tóm lại, đây là những gì tôi làm bất cứ khi nào tôi gặp vấn đề này:

Thay đổi người dùng thành người dùng đang chạy máy chủ web của bạn (apache, httpd, www-data, nginx, v.v.)

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

cdtrực tiếp vào thư mục tệp và cố gắng ghi dữ liệu ngẫu nhiên vào một tệp mới.

echo "Random text" > some_file_name

Thông thường, điều này sẽ thất bại và bạn sẽ nhận được thông báo lỗi từ HĐH, ít nhất là chuyển vấn đề ra khỏi Drupal. Nếu điều này không hoạt động, bạn có vấn đề quyền tập tin. Câu hỏi này có thể hữu ích: các quyền thư mục được đề xuất là gì?


vâng bạn đúng, tôi không thể viết bất cứ điều gì: /
Petro Popelyshko

1
Sau đó, bạn vẫn có một vấn đề cấp quyền hệ thống tập tin. Một dự đoán là bạn có các thư mục gần với thư mục gốc mà máy chủ web không được phép ghi vào. Tuy nhiên, đó là chủ đề cho một số diễn đàn không phải là drupal, vì hiện tại chúng ta có tất cả các loại vấn đề cụ thể về hệ điều hành và hệ điều hành. Bạn ít nhất biết rằng vấn đề không phải ở Drupal. :)
Letharion

Tôi có thể viết một cái gì đó như www-data, nhưng tôi vẫn nhận được lỗi. Tôi phải làm gì khác? ImageMagick được cấu hình đúng, tôi đang chạy cái này trên một máy chủ có nhiều cài đặt Drupal.
nnyby

@nnyby Vào thời điểm đó, tôi thực sự không biết phải làm gì tiếp theo. Điều duy nhất còn lại tôi có thể nghĩ đến sau đó là bắt đầu đào mã nguồn nơi xảy ra lỗi.
Letharion

Tôi đã giải quyết vấn đề - đó là các tệp hình ảnh mà Drupal đang tìm kiếm không thực sự tồn tại và thông báo lỗi đã gây hiểu nhầm.
nnyby

9

Bạn cũng nên đảm bảo rằng bạn đã cài đặt thư viện đồ họa (như php-gd) trên máy chủ của mình: check / admin / config / media / image-toolkit (D7).


1
Sau khi di chuyển sang một máy chủ khác, tôi đã gặp lỗi này, tất nhiên tôi đã quên apt-get php5-gd ;-)
TheSquad

5

Lỗi đến từ mô-đun hình ảnh (lõi) và logic trông như sau:

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

Do đó, lỗi xảy ra khi Drupal gặp vấn đề với việc tạo đạo hàm hình ảnh bằng cách áp dụng tất cả các hiệu ứng hình ảnh và lưu phiên bản được lưu trong bộ nhớ cache của hình ảnh thu được.


Cách dễ nhất để tái tạo vấn đề (cho mục đích chẩn đoán) là bằng cách đánh trống.

  1. Gọi trực tiếp image_style_create_derivative () từ drush:

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

    Thay thế picture-123.pngbằng hình ảnh hiện có từ nhật ký:

    Không thể tạo hình ảnh xuất phát ở nơi công cộng: //styles/foo/public/pictures/picture-x.png

    Hoặc sử dụng bất kỳ cái nào khác hiện có, ví dụ drush sqlq "SELECT * FROM file_managed".

    Nếu bạn không có quyền truy cập shell, hãy sử dụng mô-đun Devel, đi đến /devel/phpvà dán mã PHP ở đó.

    Lưu ý: Nếu filesthư mục thuộc sở hữu của người dùng Apache, bạn nên đăng nhập với tư cách người dùng này cho mục đích thử nghiệm. Nếu không, tiền tố lệnh drush của bạn với sudo -u www-data.

  2. Có những khả năng sau đây.

    • Thử nghiệm ở trên đã thành công (tệp đã được tạo thành công trong thư mục tệp của bạn), nếu vậy, hãy kiểm tra xem ảnh thất bại của bạn từ nhật ký có thực sự tồn tại không, có thể nó đã bị xóa khỏi máy chủ.
    • Nếu bạn có cùng thông báo lỗi hoặc tệp không được tạo, thì đó là vấn đề với sự cho phép của bạn hoặc thư viện bị thiếu (kiểm tra drush eval "print_r(gd_info());":).
    • Nếu bạn không có bất kỳ lỗi nào và tệp không được tạo, thì hãy kiểm tra xem bạn đã sử dụng đúng các tệp hiện có chưa.

Vấn đề cấp phép gỡ lỗi có thể dễ dàng đạt được bằng cách strace. Cài đặt nó và chỉ cần tiền tố bất kỳ lệnh nào mà bạn đang thử nghiệm strace -f(bạn không phải root).

Trong ví dụ:

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

Nếu bạn đã đăng nhập bằng tài khoản khác sở hữu files, thì đừng quên tiền tố lệnh drush của bạn sudo -u www-datađể chạy toàn bộ lệnh với tư cách là người dùng Apache.


4

Điều này cũng có thể do PHP được biên dịch mà không có libjpeg (nếu hình ảnh không được tạo có nguồn jpeg). Kiểm tra đầu ra gd_info()để xem có hỗ trợ PHP không.


3
để nhanh chóng in từ dòng lệnh: php -r 'print_r (gd_info ());'
Emily

Đây chắc chắn là vấn đề của tôi. (Và cảm ơn @latvian vì đã giới thiệu cmd nhanh chóng)
trimbletodd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.