Î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.