Điểm:0

Truy cập bị từ chối đối với tệp được thêm vào một nút theo chương trình

lá cờ in

Tôi có tập lệnh tùy chỉnh nhập nội dung từ cơ sở dữ liệu bên ngoài. Tôi đang đính kèm tệp bằng mã tùy chỉnh bên dưới.

$file = File::create([
  'tên_tệp' => $new_filename,
  'uri' => $folder_uri . '/' . $new_filename,// private://my_content_type/<subdir>/filename.pdf
]);
$file->setPermanent();
$file->save();

Khi phần trên hoàn tất, hãy đính kèm (các) tệp đó vào nút mới bằng cách sử dụng mã tùy chỉnh bên dưới.

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");
$dữ liệu = [
    'type' => 'my_content_type',
    'tiêu đề' => 'Tiêu đề',
    'trạng thái' => 1,
    ...
    'field_attach' => [' target_id' => $file->fid->value],
    ...
  ];
$node = $storage_handler->create($data);
$node->save();

Khi tôi chỉnh sửa cùng một nút, tôi thấy đúng tệp được đính kèm nhưng khi mở nó ở chế độ xem trước, tôi nhận được "Quyền truy cập bị từ chối", ngay cả khi tôi đã đăng nhập với tư cách quản trị viên.

Mặc dù, lĩnh vực trường_đính kèm là nhiều tệp và nếu tôi đính kèm thủ công một tệp khác từ trang chỉnh sửa và lưu tệp đó, thì tôi có thể xem trước tệp đó một cách chính xác.

gỡ lỗi:

Đây là phần phát triển cho nút:

[field_attach] => Mảng
(
    [x-default] => Mảng
    (
        [0] => Mảng
        (
            [target_id] => 1876 // Không thể xem trước, truy cập bị từ chối
            [hiển thị] => 1
            [mô tả] => 
        )
        [1] => Mảng
        (
            [ target_id ] => 1878 // Có thể xem trước
            [hiển thị] => 1
            [mô tả] => 
        )
    )
)

Trong cơ sở dữ liệu, mỗi tệp có cùng giá trị:

# select * from file_usage where fid in(1876, 1878)\G
*************************** 1. hàng ********************* *******
   năm: 1876
mô-đun: tập tin
  loại: nút
    mã số: 92
 đếm: 1
*************************** 2. hàng ********************* *******
   năm: 1878
mô-đun: tập tin
  loại: nút
    mã số: 92
 đếm: 1
2 hàng trong bộ (0,000 giây)


# select * from file_managed where fid in(1876, 1878)\G
*************************** 1. hàng ********************* *******
     năm: 1876
    uuid: 876c1bd1-566c-4d6b-a767-4925d75b593f
mã ngôn ngữ: nó
     uid: 1
tên tệp: first_file.pdf
     uri: private://my_content_type/201211/first_file.pdf
phim hoạt hình: ứng dụng/pdf
kích thước tệp: 140982
  trạng thái: 1
 tạo: 1651744379
 đã thay đổi: 1651744379
*************************** 2. hàng ********************* *******
     năm: 1878
    uuid: 4c26c169-3e92-4254-af49-e5b203caf4c6
mã ngôn ngữ: nó
     uid: 1
tên tệp: second_file.pdf
     uri: private://my_content_type/202205/first_file.pdf
phim hoạt hình: ứng dụng/pdf
kích thước tệp: 140982
  trạng thái: 1
 tạo: 1651745721
 đã thay đổi: 1651745725
2 hàng trong bộ (0,000 giây)

Quyền đối với thư mục và tệp là như nhau. Một cái gì đó khác với đính kèm thủ công và lập trình. Mất để thiết lập một cái gì đó?

Cảm ơn trước.

Điểm:1
lá cờ in

Tại trang /admin/báo cáo/truy cập bị từ chối nó có thể được tìm thấy ở nơi truy cập bị từ chối bị kích hoạt. Đối chiếu với hoàn cảnh làm việc tôi thấy cần phải thêm một dòng vào file_usage cái bàn. Đây là mã dòng cần thiết để đặt sau khi nút được lưu:

\Drupal::service('file.usage')->add($file, 'file', 'node', $node->id());

trong đó dịch vụ là một thể hiện của Drupal\file\FileUsage\DatabaseFileUsageBackend lớp.

Điểm:0
lá cờ us

Mã của bạn có vẻ ổn với tôi. Tuy nhiên, không chắc bạn muốn có quyền đối với tệp nào. Bạn đã thử chuyển id người dùng để xem liệu bạn có thể xem tệp đã tải lên không?

  $file = File::create([
      'tên_tệp' => $new_filename,
      'uri' => $folder_uri . '/' . $new_filename,
      'uid' => 1,
    ]);

Chỉ là một đề xuất, lý tưởng nhất là chuyển id tệp bằng hàm id().

 'đích_id' => $file->id(),
lá cờ in
Cảm ơn bạn đã trả lời và cũng đã sửa lỗi tiếng Anh của tôi :) Tôi đã thử đề xuất của bạn nhưng tình hình không thay đổi. Tôi đã sửa lỗi nhờ các nhật ký có tại trang `admin/reports/access-denied` và tôi đã tìm ra nguyên nhân của lỗi. Tôi đề xuất nó như một câu trả lời. cảm ơn.
Pushpinder Rana avatar
lá cờ us
Rất vui vì bạn đã tìm ra giải pháp. Cảm ơn đã chia sẻ câu trả lời.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.