Puncte:0

Acces refuzat pentru fișierul adăugat programatic la un nod

drapel in

Am un script personalizat care importă conținut dintr-o bază de date externă. Atașez fișiere folosind codul personalizat de mai jos.

$file = File::create([
  'filename' => $new_filename,
  'uri' => $folder_uri . '/' . $new_filename,// private://my_content_type/<subdir>/filename.pdf
]);
$fișier->setPermanent();
$fișier->salvare();

Odată ce partea de mai sus este completă, apoi atașați acel fișier(e) la noul nod folosind codul personalizat de mai jos.

$storage_handler = \Drupal::entityTypeManager()->getStorage("nod");
$date = [
    'type' => 'tipul_meu_conținut',
    'title' => 'Un titlu',
    'status' => 1,
    ...
    'field_attach' => ['target_id' => $fișier->fid->valoare],
    ...
  ];
$nod = $storage_handler->create($date);
$nod->salvare();

Când editez același nod, văd atașat fișierul corect, dar în timp ce îl deschid în previzualizare, primesc „Acces refuzat”, chiar și eu sunt logat ca administrator.

Cu toate acestea, câmpul field_attach este unul multiplu și dacă atașez manual un alt fișier din pagina de editare și îl salvez, atunci îl pot previzualiza corect.

depanare:

Aceasta este partea de dezvoltare pentru nod:

[field_attach] => Matrice
(
    [x-default] => Matrice
    (
        [0] => Matrice
        (
            [target_id] => 1876 // Nu se poate previzualiza, acces refuzat
            [afișare] => 1
            [descriere] => 
        )
        [1] => Matrice
        (
            [target_id] => 1878 // Se poate previzualiza
            [afișare] => 1
            [descriere] => 
        )
    )
)

În baza de date, fiecare fișier are aceleași valori:

# selectați * din file_usage unde fid in(1876, 1878)\G
**************************** 1. rând ******************** ******
   fid: 1876
modul: dosar
  tip: nod
    id: 92
 număr: 1
**************************** 2. rând ******************** ******
   fid: 1878
modul: dosar
  tip: nod
    id: 92
 număr: 1
2 rânduri în set (0.000 sec)


# selectați * din file_managed unde fid in(1876, 1878)\G
**************************** 1. rând ******************** ******
     fid: 1876
    uuid: 876c1bd1-566c-4d6b-a767-4925d75b593f
langcode: it
     uid: 1
nume de fișier: primul_fișier.pdf
     uri: private://my_content_type/201211/first_file.pdf
filemime: aplicație/pdf
dimensiune fișier: 140982
  stare: 1
 creat: 1651744379
 schimbat: 1651744379
**************************** 2. rând ******************** ******
     fid: 1878
    uuid: 4c26c169-3e92-4254-af49-e5b203caf4c6
langcode: it
     uid: 1
nume de fișier: al doilea_fișier.pdf
     uri: private://my_content_type/202205/first_file.pdf
filemime: aplicație/pdf
dimensiune fișier: 140982
  stare: 1
 creat: 1651745721
 schimbat: 1651745725
2 rânduri în set (0.000 sec)

Permisiunile sunt aceleași pentru directoare și pentru fișiere. Ceva este diferit de atașat manual și programatic. Ai pierdut pentru a seta ceva?

Mulțumesc anticipat.

Puncte:1
drapel in

La pagina /admin/reports/access-denied poate fi găsit acolo unde accesul refuzat este concediat. Comparând cu o situație de lucru, constat că este necesar să adăugați și o linie în utilizare_fișier masa. Acesta este codul de linie necesar pentru a fi plasat după ce nodul este salvat:

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

unde serviciul este o instanță de Drupal\file\FileUsage\DatabaseFileUsageBackend clasă.

Puncte:0
drapel us

Codul tău mi se pare OK. Cu toate acestea, nu sunt sigur ce permisiunea de fișier doriți. Ați încercat să transmiteți ID-ul de utilizator pentru a vedea dacă puteți vedea fișierul încărcat?

  $file = File::create([
      'filename' => $new_filename,
      'uri' => $folder_uri . '/' . $new_filename,
      'uid' => 1,
    ]);

Doar o recomandare, ideal ar fi să treceți id-ul fișierului folosind funcția id().

 'target_id' => $fișier->id(),
drapel in
Vă mulțumesc pentru răspuns și pentru că mi-ați corectat engleza :) Am încercat sugestia ta, dar situația nu se schimbă. Am depanat datorită jurnalelor prezente la pagina `admin/reports/access-denied` și am găsit motivul erorii. O propun ca răspuns. Mulțumiri.
Pushpinder Rana avatar
drapel us
Ma bucur ca ai gasit solutia. Mulțumesc pentru împărtășirea răspunsului.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.