Simplest way to serve static data from outside the application server in a Java web application
Простейший способ обслуживания статических данных извне сервера приложений в веб-приложении Java
У меня есть веб-приложение Java, работающее на Tomcat. Я хочу загрузить статические изображения, которые будут отображаться как в веб-интерфейсе, так и в файлах PDF, сгенерированных приложением. Также новые изображения будут добавлены и сохранены путем загрузки через веб-интерфейс.
Это не проблема сделать, храня статические данные внутри веб-контейнера, но хранение и загрузка их извне веб-контейнера вызывает у меня головную боль.
На данном этапе я бы предпочел не использовать отдельный веб-сервер, такой как Apache, для обслуживания статических данных. Мне также не нравится идея хранения изображений в двоичном формате в базе данных.
Я видел несколько предложений, например, чтобы каталог изображений был символической ссылкой, указывающей на каталог вне веб-контейнера, но будет ли этот подход работать как в средах Windows, так и * nix?
Некоторые предлагают написать фильтр или сервлет для обработки подачи изображений, но эти предложения были очень расплывчатыми и высокоуровневыми, без указателей на более подробную информацию о том, как это сделать.
Переведено автоматически
Ответ 1
Я видел несколько предложений, например, чтобы каталог изображений был символической ссылкой, указывающей на каталог вне веб-контейнера, но будет ли этот подход работать как в средах Windows, так и * nix?
Если вы придерживаетесь правил пути к файловой системе * nix (т. Е. Используете исключительно косые черты, как в /path/to/files), то он будет работать и в Windows без необходимости возиться с уродливыми File.separator конкатенациями строк. Однако они будут сканироваться только на том же рабочем диске, с которого была вызвана эта команда. Итак, если Tomcat, например, установлен на C:, то /path/to/files фактически будет указывать на C:\path\to\files.
Если все файлы расположены вне веб-приложения, и вы хотите, чтобы Tomcat DefaultServlet обрабатывал их, то все, что вам в принципе нужно сделать в Tomcat, это добавить следующий элемент контекста в тег /conf/server.xml inside <Host>:
<ContextdocBase="/path/to/files"path="/files" />
Таким образом, они будут доступны через http://example.com/files/.... Для серверов на базе Tomcat, таких как JBoss EAP 6.x или более поздней версии, подход в основном тот же, смотрите также Здесь. Пример конфигурации GlassFish/ Payara можно найти здесь, а пример конфигурации WildFly можно найти здесь.
Если вы хотите самостоятельно контролировать чтение / запись файлов, то вам нужно создать Servlet для этого, который в основном просто получает InputStream файл в формате, подобном, например, FileInputStream и записывает его в OutputStream из HttpServletResponse.
В ответе вы должны установить Content-Type заголовок, чтобы клиент знал, какое приложение связать с предоставленным файлом. И вы должны установить Content-Length заголовок, чтобы клиент мог вычислять ход загрузки, в противном случае он будет неизвестен. И вам следует установить для Content-Disposition заголовка значениеattachment, если вы хотите, чтобы появилось диалоговое окно Сохранить как, в противном случае клиент попытается отобразить его встроенным. Наконец, просто запишите содержимое файла в поток вывода ответа.
Например, при отображении на url-pattern of /files/*, вы можете вызвать его через http://example.com/files/image.png. Таким образом, вы можете иметь больший контроль над запросами, чем DefaultServlet делает, например, предоставляя изображение по умолчанию (т. Е. if (!file.exists()) file = new File("/path/to/files", "404.gif") или около того). Также использование request.getPathInfo() предпочтительнее выше request.getParameter(), потому что это более удобно для SEO, а в противном случае IE не выберет правильное имя файла во время сохранения как.
Вы можете повторно использовать ту же логику для обслуживания файлов из базы данных. Просто замените new FileInputStream() на ResultSet#getInputStream().
Вы можете сделать это, разместив свои изображения по фиксированному пути (например: /var/images или c:\images), добавив параметр в настройках вашего приложения (представленный в моем примере параметром Settings.class) и загружать их таким образом в HttpServlet вашем:
тогда HTML-код был бы <img src="imageServlet?imageName=myimage.png" />
Конечно, вам следует подумать об обслуживании различных типов контента - "изображение / jpeg", например, на основе расширения файла. Также вам следует обеспечить некоторое кэширование.
Кроме того, вы могли бы использовать этот сервлет для качественного изменения масштаба ваших изображений, предоставляя параметры ширины и высоты в качестве аргументов и используя image.getScaledInstance(w, h, Image.SCALE_SMOOTH), учитывая производительность, конечно.
Ответ 3
Требование: доступ к статическим ресурсам (изображениям / видео и т.д.) Извне каталога WEBROOT или с локального диска
Шаг 1 : Создайте папку в webapps сервера tomcat., допустим, имя папки - myproj
Шаг 2: В myproj создайте папку WEB-INF в рамках этого создайте простой web.xml