Все начинается в один прекрасный день, когда я получаю новую историю. Описание истории было следующим: «Я как пользователь хочу увидеть предварительный просмотр документа». Это казалось ясным. Серверная часть была завершена и вернула фактический файл, который вы загружали.

Я начал исследовать, казалось, что iframe был подходящим вариантом и передал файл в формате base64 в iframe src, используя API FileReader.

Первоначальная реализация использовала readAsDataURL, а результат передавался как iframe src.

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

Проблемы

  1. Максимальная длина URL различается в разных браузерах, поэтому в некоторых браузерах это будет одним большим ограничением максимальной длины URL, а в некоторых — нет, но не будет отображаться.
  2. readAsDataURL преобразует буфер в строку base64 и сохраняет ее в памяти. Когда вы его не используете, память очищается сборщиком мусора.

Решение

В качестве решения всех этих проблем я использовал readAsArrayBuffer и создал URL-адрес объекта.

Решение позволяло отображать большие PDF-файлы, протестировано с файлами размером более 250 МБ.