Я видел несколько предложений, например, чтобы каталог изображений был символической ссылкой, указывающей на каталог за пределами веб-контейнера, но будет ли этот подход работать как в среде Windows, так и в среде * nix?
Если вы придерживаетесь правил пути к файловой системе * nix (то есть используете исключительно прямые косые черты, как в /path/to/files
), тогда он будет работать и в Windows без необходимости возиться с уродливыми File.separator
конкатенациями строк. Однако он будет сканироваться только на том же рабочем диске, с которого была вызвана эта команда. Так что, если Tomcat установлен, например, C:
тогда /path/to/files
фактически будет указывать на C:\path\to\files
.
Если все файлы расположены за пределами веб-приложения, и вы хотите, чтобы Tomcat DefaultServlet
обрабатывал их, все, что вам нужно сделать в Tomcat, - это добавить следующий элемент Context во /conf/server.xml
внутренний <Host>
тег:
<Context docBase="/path/to/files" path="/files" />
Таким образом, они будут доступны через http://example.com/files/...
. Пример конфигурации GlassFish / Payara можно найти здесь, а пример конфигурации WildFly - здесь .
Если вы хотите , чтобы иметь контроль над чтением / запись файлов самостоятельно, то вам необходимо создать Servlet
для этого , которое в основном только получает InputStream
из файла в аромате, например , FileInputStream
и записывает его в OutputStream
из HttpServletResponse
.
В ответе вы должны установить Content-Type
заголовок, чтобы клиент знал, какое приложение связать с предоставленным файлом. И вы должны установить Content-Length
заголовок, чтобы клиент мог рассчитать прогресс загрузки, иначе он будет неизвестен. И вы должны установить Content-Disposition
заголовок, attachment
если вы хотите диалоговое окно « Сохранить как », иначе клиент попытается отобразить его встроенным. Наконец, просто запишите содержимое файла в выходной поток ответа.
Вот базовый пример такого сервлета:
@WebServlet("/files/*")
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
File file = new File("/path/to/files", filename);
response.setHeader("Content-Type", getServletContext().getMimeType(filename));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
}
При отображении, url-pattern
например /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()
.
Надеюсь это поможет.
Смотрите также:
<Context docBase="/path/to/images" path="/images" />
в Windows, но получаю путь относительно папки webapps:C:\install\apache-tomcat-8.0.26\webapps\tmp] is not valid
<Context docBase="C:\tmp\" path="/images" />
HTTP Status 404 - /images/
при выполнении:,http://localhost:8080/images/
НО конкретный файл из-подtmp
работает:http://localhost:8080/images/Tulips.jpg
ОКВы можете сделать это, поместив свои изображения по фиксированному пути (например: / var / images или c: \ images), добавив параметр в настройки вашего приложения (представленный в моем примере как Settings.class) и загрузив их вот так, в одном
HttpServlet
из ваших:Или, если вы хотите изменить изображение:
тогда код html будет
<img src="imageServlet?imageName=myimage.png" />
Конечно, вам следует подумать об обслуживании различных типов контента - например, «изображение / jpeg» на основе расширения файла. Также вы должны обеспечить кеширование.
Кроме того, вы можете использовать этот сервлет для качественного изменения масштаба ваших изображений, предоставив параметры ширины и высоты в качестве аргументов и используя
image.getScaledInstance(w, h, Image.SCALE_SMOOTH
), конечно, учитывая производительность.источник
Добавьте в server.xml:
Включите параметр списка файлов dir в web.xml:
источник
Требование: доступ к статическим ресурсам (изображениям / видео и т. Д.) Вне каталога WEBROOT или с локального диска
Шаг 1:
Создайте папку в веб-приложениях сервера tomcat., Скажем, имя папки myproj
Шаг 2:
В myproj создайте папку WEB-INF, в ней создайте простой web.xml
код под web.xml
Структура каталогов для двух вышеуказанных шагов
Шаг 3.
Теперь создайте XML-файл с именем myproj.xml в следующем месте.
КОД в myproj.xml:
Шаг 4:
4 A) Теперь создайте папку с именем myproj на диске E вашего жесткого диска и создайте новый
папку с именами изображения и поместите несколько изображений в папку изображений
(e:myproj\images\)
Предположим, myfoto.jpg находится в
e:\myproj\images\myfoto.jpg
4 B) Теперь создайте папку с именем WEB-INF
e:\myproj\WEB-INF
и создайте файл web.xml в папке WEB-INF.Код в web.xml
Шаг 5:
Теперь создайте документ .html с именем index.html и поместите его в папку e: \ myproj.
КОД в index.html Добро пожаловать в Myproj
Структура каталогов для шагов 4 и 5 выше выглядит следующим образом
Шаг 6.
Теперь запустите сервер Apache Tomcat.
Шаг 7:
откройте браузер и введите URL-адрес следующим образом
затем вы отобразите содержимое, которое предоставлено в index.html
Шаг 8:
для доступа к изображениям на локальном жестком диске (вне корневого каталога)
источник
Это история с моего рабочего места:
- Мы пытаемся загружать несколько изображений и файлов документов, используя Struts 1 и Tomcat 7.x.
- Мы пытаемся записать загруженные файлы в файловую систему, имя файла и полный путь к записям базы данных.
- Мы стараемся отделить папки с файлами вне каталога веб-приложения . (*)
Приведенное ниже решение довольно простое, эффективное для требования (*):
В файле
META-INF/context.xml
файл со следующим содержимым: (Например, мое приложение запущеноhttp://localhost:8080/ABC
, мое приложение / проект названоABC
). (это тоже полное содержимое файлаcontext.xml
)(работает с Tomcat версии 7 или новее)
Результат: Нам создано 2 псевдонима. Например, мы сохраняем изображения по адресу:
D:\images\foo.jpg
и просматриваем по ссылке или с помощью тега изображения:или
(Я использую Netbeans 7.x, кажется, что Netbeans автоматически создает файл
WEB-INF\context.xml
)источник
Если вы решили направить в
FileServlet
то вам также необходимоallowLinking="true"
вcontext.xml
для того , чтобыFileServlet
пройти через символические ссылки.См. Http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
источник
если кто-то не может решить свою проблему с помощью принятого ответа, обратите внимание на следующие соображения:
localhost:<port>
с<img> src
атрибутом.context docBase
запись самостоятельно внутри своего локальногоserver.xml
файла.источник
Прочтите InputStream файла и запишите его
ServletOutputStream
для отправки двоичных данных клиенту.Приведите URL-адрес прямо к
src
атрибуту.источник
Если вы хотите работать с JAX-RS (например, RESTEasy), попробуйте следующее:
используя
javax.ws.rs.core.Response
иcom.google.common.io.ByteStreams
источник
Я сделал еще проще. Проблема: в файле CSS есть URL-ссылки на папку img. Получает 404.
Я просмотрел URL-адрес http: // tomcatfolder: port / img / blablah.png , которого не существует. Но это действительно указывает на приложение ROOT в Tomcat.
Поэтому я просто скопировал папку img из своего веб-приложения в это приложение ROOT. Работает!
Не рекомендуется, конечно, для производства, но это для внутреннего приложения для разработки инструментов.
источник