Я пытаюсь получить изображение из личной папки для отображения на странице шаблона Twig для печати.Личная папка недоступна для браузеров, и единственный известный мне метод отображения — загрузить изображение, преобразовать его в Base64 и передать символы Base64 в атрибут «src» элемента «img».
Мой код контроллера выглядит примерно так:
класс PrinterFriendlyController расширяет ControllerBase {
общедоступная функция printFriendly($text) {
// Загружаем изображение из частного каталога и конвертируем в base64
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$image = $this->entityTypeManager
->getStorage('файл')
->загрузить($file_id);
$image_path = PrivateStream::basePath() . '/картинки/' . $изображение->получитьимя_файла();
$image_data = file_get_contents($image_path);
$image_base64 = 'данные:' . finfo_file($finfo, $image_path) . ';base64,' . base64_encode($image_data);
$ страница = [
// Определенно длиннее 255 символов
'#image_base64' => $image_base64,
// Это тоже не работает, так что проблема не в длине символов
//'#image_base64' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHEleQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==',
'#текст' => $текст,
'#theme' => 'printer_friendly',
];
вернуть $страницу;
}
}
Файл шаблона выглядит примерно так:
<div id="printer-friendly">
<img src="{{ image_base64 }}" />
<div id="text">{{ text }}</div>
</div>
Элемент «текст» содержит пользовательский текст, который размещается над элементом «img» с помощью CSS, но включается только для контекста. Это не связано с проблемой.
Результат, который появляется в Chrome Inspect:
<img src="">
или же
<img src(unknown)>
Либо Drupal, либо Twig блокируют символы изображения Base64, но я не знаю, какой из них блокирует, и я не знаю, как предотвратить это.