Я полагаю, что эти устройства требуют поддержки Range
на стороне сервера, чтобы контент можно было запрашивать отдельными частями.В конечном итоге это экономит ненужную пропускную способность сети и улучшает ощущение производительности на стороне клиента.
Если эти PDF-файлы генерируются динамически, то лучше всего записать их во временную папку в файловой системе диска и перенаправитьзапрос URL, который читает их с помощью сервлета.Наличие физического файла является обязательным, поскольку вы хотите использовать RandomAccessFile
, чтобы иметь возможность вернуть частичное содержимое файла.Для этого класса требуется физический File
на диске.
Вот пример, который использует File#createTempFile()
для создания временного файла и перенаправляет ответ сервлету симя файла в качестве параметра URL:
File tempFile = File.createTempFile(saveFilename, ".pdf");
OutputStream output = new FileOutputStream(tempFile);
// Now write PDF to output.
// ...
// Then, redirect to some servlet URL.
String tempFilename = tempFile.getName();
externalContext.redirect("/pdf/" + URLEncoder.encode(tempFilename, "UTF-8"));
Затем вам нужно иметь сервлет, подобный , этот , который поддерживает запросы диапазона.Вам нужно только изменить его, чтобы изменить значение basePath
на System.getProperty("java.io.tmpdir")
.Наконец, сопоставьте этот сервлет с шаблоном URL-адреса /pdf/*
.
В качестве альтернативы, если у вас есть полный административный контроль над сервером, вы также можете создать дополнительный контекст веб-приложения, указывающий на абсолютный путь где-то на диске сервера.файловая система.Например, /var/webapp/pdf
.В случае, например, Tomcat, вы можете сделать это общедоступным, добавив следующее к /conf/server.xml
:
<Context docBase="/var/webapp/pdf" path="/pdf" />
Таким образом, содержимое папки /var/webapp/pdf
доступно для http://localhost:8080/context/pdf.
С незначительным изменением в приведенном выше примере кода для указания местоположения временного файла,
File tempFile = File.createTempFile(saveFilename, ".pdf", "/var/webapp/pdf");
// ...
вам больше не нужен пользовательский сервлет.Tomcat DefaultServlet
выполнит работу по правильной обработке Range
запросов.
И последнее, но не менее важное, рассмотрите возможность хранения временного файла в сеансе и реализации HttpSessionListener
или HttpSessionAttributeListener
, который удаляет временный файл после окончания сеанса.