Puncte:0

Fișierul privat nu este afișat pe șablonul Twig

drapel ru

Încerc să obțin o imagine din folderul privat pentru a fi afișată pe o pagină de șablon Twig ușor de imprimat.Dosarul privat este inaccesibil pentru browsere și singura metodă de afișare pe care o cunosc este să încărcăm imaginea și să o convertesc în Base64 și să trec caracterele Base64 în atributul „src” al unui element „img”.

Codul controlerului meu arată cam așa:

clasa PrinterFriendlyController extinde ControllerBase {

  funcția publică printerFriendly($text) {

    // Încărcați imaginea din directorul privat și convertiți-o în base64
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $image = $this->entityTypeManager
      ->getStorage('fișier')
      ->load($file_id);
    $image_path = PrivateStream::basePath() . '/imagini/' . $image->getFilename();
    $image_data = file_get_contents($image_path);
    $image_base64 = 'date:' . finfo_file($finfo, $image_path) . ';base64,' . base64_encode($date_imagine);

    $pagina = [
      // Cu siguranță mai mult de 255 de caractere
      '#image_base64' => $image_base64,
      // Nici asta nu funcționează, așa că nu este o problemă de lungime a caracterelor
      //'#image_base64' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5=','
      '#text' => $text,
      '#theme' => 'printer_friendly',
    ];

    returneaza $pagina;
  }
}

Fișierul șablon arată cam așa:

<div id="printer-friendly">
  <img src="{{ image_base64 }}" />
  <div id="text">{{ text }}</div>
</div>

Elementul „text” conține text personalizat care este poziționat peste elementul „img” folosind CSS, dar este inclus doar pentru context. Nu are legătură cu problema.

Rezultatul care apare pe Chrome Inspect este:

<img src="">

sau

<img src(unknown)>

Fie Drupal, fie Twig blochează caracterele imaginii Base64, dar nu știu care dintre ele face blocarea și nu știu cum să îl împiedic să facă acest lucru.

MrD avatar
drapel cn
MrD
Ce zici dacă remediați date precum rândul dvs. comentat `//'#image_base64' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO5wJAA0JNBAA450DHxgljNBAAO5WJAA00H0AAAAAA se poate afișa imaginea?
drapel ru
Nu, nu este. Am folosit acea linie pentru a vedea dacă problema este cauzată de o limită de caractere, dar nu este. Drupal filtrează șirul Base64 din alt motiv.
Puncte:1
drapel cn
MrD

Poate că problema ta vine de la tema funcției printer_friendly. Dacă definiți această funcție, trebuie să furnizați variabile atunci când definiți. Dacă această funcție din modulul de contribuție, puteți utiliza hook_preprocess_printer_friendly pentru a adăuga mai multe variabile înainte de a randa în șablonul twig.

drapel ru
Este un modul personalizat cu un șablon Twig. Are mai multe variabile text, cum ar fi „#text”, care se afișează atunci când pagina este redată. De asemenea, dacă codific imaginea Base64 din șablon cu ceva de genul „', imaginea se afișează corect. Doar atunci când încerc să trec o variabilă șir de caractere Base64 atributului „src” de imagine, fie Drupal, fie Twig o interzice și o face goală. Știu că șirul de caractere Base64 este blocat, dar nu știu unde, de ce sau dacă există o modalitate de a o ocoli. Multumesc pentru raspunsul tau.
MrD avatar
drapel cn
MrD
ai încercat {{ image_base64|raw }}
drapel ru
Raspunsul tau este corect. Doar că nu am înțeles pe deplin prima dată când l-am citit. Nu mi-am amintit să adaug noua variabilă „image_base64” la „hook_theme”. După ce l-am adăugat, a funcționat cu șirul scurt de testare cu punct roșu Base64, dar, când a fost transmis șirul lung de imagine Base64 de peste 100 de kiloocteți, un „RuntimeException: Nu a putut începe sesiunea deoarece anteturile au fost deja trimise de...” a fost aruncat, așa că a trebuit să declanșez serviciul „page_cache_kill_switch”. Mulțumesc.
MrD avatar
drapel cn
MrD
@user320691 De ce nu utilizați fișierul privat URL implicit? și folosind hook_file_download pentru a controla. Cred că e mai bine pentru tine.

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.