Рейтинг:0

Частный файл не отображается в шаблоне Twig

флаг ru

Я пытаюсь получить изображение из личной папки для отображения на странице шаблона 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, но я не знаю, какой из них блокирует, и я не знаю, как предотвратить это.

MrD avatar
флаг cn
MrD
Как насчет того, чтобы исправить данные, подобные вашей строке, прокомментированной `//'#image_base64' => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAAABJRU5ErkJggg==',``,``, может ли изображение отображаться?
флаг ru
Нет, это не так. Я использовал эту строку, чтобы увидеть, вызвана ли проблема ограничением символов, но это не так. Drupal отфильтровывает строку Base64 по какой-то другой причине.
Рейтинг:1
флаг cn
MrD

Возможно, ваша проблема связана с темой функции print_friendly. Если вы определяете эту функцию, вы должны указать переменные при определении. Если эта функция из модуля вклада, вы можете использовать hook_preprocess_printer_friendly, чтобы добавить больше переменных перед рендерингом в шаблоне ветки.

флаг ru
Это пользовательский модуль с шаблоном Twig. Он имеет несколько текстовых переменных, таких как «#text», которые отображаются при отображении страницы. Кроме того, если я жестко закодирую изображение Base64 в шаблоне чем-то вроде '', изображение отображается правильно. Только когда я пытаюсь передать переменную строки символов Base64 в атрибут изображения «src», Drupal или Twig запрещают это и делают его пустым. Я знаю, что строка символов Base64 заблокирована, но я не знаю, где, почему и есть ли способ обойти это. Благодарю за ваш ответ.
MrD avatar
флаг cn
MrD
вы пробовали {{ image_base64|raw }}
флаг ru
Ваш ответ правильный. Я просто не до конца понял это в первый раз, когда я прочитал это. Я не забыл добавить новую переменную «image_base64» в «hook_theme». После того, как я добавил его, он работал с короткой тестовой строкой с красной точкой Base64, но когда была передана длинная строка Base64 изображения размером более 100 килобайт, «RuntimeException: не удалось запустить сеанс, поскольку заголовки уже были отправлены ...» был брошен, поэтому мне пришлось запустить службу page_cache_kill_switch. Спасибо.
MrD avatar
флаг cn
MrD
@user320691 user320691 Почему вы не используете частный файл URL по умолчанию? и используя hook_file_download для управления. Я думаю, это лучше для вас.

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

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