Рейтинг:0

Отказано в доступе к программно добавленному файлу на узел

флаг in

У меня есть собственный скрипт, который импортирует содержимое из внешней базы данных. Я прикрепляю файлы, используя приведенный ниже пользовательский код.

$файл = Файл::создать([
  'имя_файла' => $ новое_имя_файла,
  'uri' => $folder_uri . '/' . $new_filename,// private://my_content_type/<subdir>/filename.pdf
]);
$файл->setPermanent();
$файл->сохранить();

Как только вышеуказанная часть будет завершена, прикрепите эти файлы к новому узлу, используя приведенный ниже пользовательский код.

$storage_handler = \Drupal::entityTypeManager()->getStorage("узел");
$ данные = [
    'тип' => 'my_content_type',
    'title' => 'Заголовок',
    'статус' => 1,
    ...
    'field_attach' => ['target_id' => $file->fid->value],
    ...
  ];
$node = $storage_handler->create($data);
$узел->сохранить();

Когда я редактирую тот же узел, я вижу правильный прикрепленный файл, но при его открытии в режиме предварительного просмотра я получаю сообщение «Отказано в доступе», даже если я зарегистрирован как администратор.

Хотя, поле field_attach является множественным, и если я вручную прикреплю другой файл со страницы редактирования и сохраню его, то я смогу правильно просмотреть его.

отлаживать:

Это часть разработки для узла:

[field_attach] => Массив
(
    [x-по умолчанию] => Массив
    (
        [0] => Массив
        (
            [target_id] => 1876 // Предварительный просмотр невозможен, доступ запрещен
            [отображение] => 1
            [описание] => 
        )
        [1] => Массив
        (
            [target_id] => 1878 // Можно предварительно просмотреть
            [отображение] => 1
            [описание] => 
        )
    )
)

В базе данных каждый файл имеет одинаковые значения:

# выберите * из file_usage, где fid in(1876, 1878)\G
*************************** 1-й ряд ********************** *******
   дата: 1876 г.
модуль: файл
  тип: узел
    идентификатор: 92
 количество: 1
*************************** 2-й ряд ********************** *******
   дата: 1878 г.
модуль: файл
  тип: узел
    идентификатор: 92
 количество: 1
2 ряда в наборе (0,000 сек)


# выберите * из file_managed где найти в (1876, 1878)\G
*************************** 1-й ряд ********************** *******
     дата: 1876 г.
    UUID: 876c1bd1-566c-4d6b-a767-4925d75b593f
код языка: это
     ИД: 1
имя файла: первый_файл.pdf
     uri: частный://my_content_type/201211/first_file.pdf
filemime: приложение/pdf
Размер файла: 140982
  статус: 1
 создано: 1651744379
 изменено: 1651744379
*************************** 2-й ряд ********************** *******
     дата: 1878 г.
    UUID: 4c26c169-3e92-4254-af49-e5b203caf4c6
код языка: это
     ИД: 1
имя файла: второй_файл.pdf
     uri: частный://my_content_type/202205/first_file.pdf
filemime: приложение/pdf
Размер файла: 140982
  статус: 1
 создано: 1651745721
 изменено: 1651745725
2 ряда в наборе (0,000 сек)

Права доступа одинаковы для каталогов и файлов. Что-то отличается от ручного и программного присоединения. Забыли что-то установить?

Заранее спасибо.

Рейтинг:1
флаг in

На странице /admin/отчеты/отказано в доступе его можно найти там, где срабатывает отказ в доступе. Сравнивая с рабочей ситуацией, я считаю, что необходимо добавить также строку в file_usage Таблица. Это код строки, который необходимо разместить после сохранения узла:

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

где служба является экземпляром Drupal\файл\FileUsage\DatabaseFileUsageBackend учебный класс.

Рейтинг:0
флаг us

Ваш код выглядит нормально для меня. Однако не уверен, какое разрешение файла вы хотите. Вы пытались передать идентификатор пользователя, чтобы увидеть, можете ли вы увидеть загруженный файл?

  $файл = Файл::создать([
      'имя_файла' => $ новое_имя_файла,
      'ури' => $folder_uri . '/' . $ новое_имя_файла,
      'ид' => 1,
    ]);

Просто рекомендация, было бы идеально передать идентификатор файла с помощью функции id().

 'target_id' => $file->id(),
флаг in
Спасибо за ваш ответ, а также за исправление моего английского :) Я попробовал ваше предложение, но ситуация не меняется. Я провел отладку благодаря журналам, представленным на странице «admin/reports/access-denied», и нашел причину ошибки. Предлагаю в качестве ответа. Благодарю.
Pushpinder Rana avatar
флаг us
Рад, что вы нашли решение. Спасибо, что поделились ответом.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.