Отображение изображения с абсолютным путем в JSP

Я использую Java, JSP и Jetty для разработки веб-сайта.

У меня возникла проблема с путями изображений, переданными в src тегов <img>.

В моей базе данных у меня есть абсолютный путь Linux к изображениям пользователей. Я получаю это значение и помещаю его в атрибут "src".

У меня есть путь, например:

  • /главная/веб-сайт/изображения/image1.png

Таким образом, изображение не появляется. Долго размышляя, я пришел к выводу, что это естественно, потому что я никогда не видел ни на одном сайте изображения с таким путем к абсолютному пути ОС.

Что мне нужно знать, что я должен делать?

Должен ли я изменить конфигурацию Jetty? Должен ли я запускать какой-то код на Java?

Поискав в гугле, я еще больше запутался. Я хотел бы объяснения.


ОБНОВЛЕНИЕ (26.03.2013)

Я нашел такой способ решения этой проблемы:

http://balusc.blogspot.com.br/2007/04/imageservlet.html

Спасибо BalusC! хау-ха-ха-хауа


person Vitor Braga    schedule 09.05.2012    source источник


Ответы (2)


Действительно, <img src> должен ссылаться на общедоступный веб-URL, а не на путь к файловой системе локального диска. Ваши изображения должны быть доступны по HTTP-запросу. Именно веб-браузер должен их загружать, а не веб-сервер должен их каким-то образом включать.

Самым простым способом для начинающих было бы создание сервлета, который получает содержимое изображения в виде InputStream на FileInputStream на основе параметра запроса или информации о пути, а затем записывает его обычным способом ввода-вывода Java в OutputStream из HttpServletResponse после установки необходимых Заголовки ответа HTTP, чтобы браузер понимал, как с этим бороться.

Например, если предположить, что сервлет отображается на /images/*, и вы открываете изображение как http://example.com/contextpath/images/image1.png:

String filename = request.getPathInfo();
File file = new File("/home/website/images", filename);

response.setHeader("Content-Type", getServletContext().getMimeType(filename));
response.setHeader("Content-Length", String.valueOf(file.length()));

InputStream input = new FileInputStream(file);
OutputStream output = response.getOutputStream();
// Stream bytes the usual way.

Альтернативой является добавление /home/website/images в качестве нового контекста веб-приложения на сервер с путем к контексту /images. Таким образом, изображение будет доступно по адресу http://example.com/images/image1.png. Вы зависите только от производителя/версии контейнера сервлетов, как это настроить, а также от того, имеете ли вы полный административный контроль над ним. Для Jetty это будет следующим, если вы управляете им программно:

server.setHandler(new WebAppContext("/home/webapp/images", "/images"));

Или когда вы управляете им с помощью XML:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="resourceBase">/home/website/images</Set>
    <Set name="contextPath">/images</Set>
</Configure>
person BalusC    schedule 09.05.2012
comment
Отлично! Что касается первого решения, не будет ли оно неэффективным, если у меня будет слишком много изображений? О решении 2º, которое мне понравилось больше, где бы я установил этот новый WebAppContext? Могу ли я сделать это и в файле xml? Большое спасибо!! знак равно - person Vitor Braga; 09.05.2012
comment
Я поместил тот же код в context.xml, как вы упомянули, но это не сработало... вы уверены? - person Vitor Braga; 09.05.2012
comment
Извините, <Set name="webApp"> должно быть <Set name="resourceBase">. Что касается эффективности 1-го решения, то оно не хуже стриминга, но не учитывает запросы к кешу браузера. - person BalusC; 09.05.2012
comment
Спасибо за обновления! Я обновил файл context.xml, но изображения по-прежнему не отображаются. (Предполагалось получить изображение по example.com/im/image1.png, но он все еще не видит папку /im и изображение не появляется... я в отчаянии... - person Vitor Braga; 09.05.2012
comment
Извините, я не пользуюсь Jetty. Я просто отвечаю на основе его документации. - person BalusC; 09.05.2012

Судя по словам, которые вы использовали в своем URI, похоже, что вы указываете путь к файлу в файловой системе в атрибуте src вместо URL-адреса, который однозначно идентифицирует ресурс.

Абсолютные пути не являются абсолютными из вашей файловой системы, они абсолютны из корня вашего веб-сервера. Кроме того, эти идентификаторы ресурсов URL-адресов можно даже изменить или модифицировать для сопоставления с различными папками на вашем сервере или даже с динамическими ресурсами.

Вот пример:

Путь к файлу на сервере:

/home/website/images/image1.png

example.com сопоставлен с папкой "веб-сайт":

При использовании относительного URL-адреса вы, возможно, видите:

<img src="/images/image1.png" />

Чтобы использовать абсолютный URL, вам понадобится схема HTTP:

<img src="http://example.com/images/image1.png" />

Таким образом, использование путей к файлам для идентификации ресурсов на вашем сервере с помощью HTML на стороне клиента просто неверно и не будет работать.

person jmort253    schedule 09.05.2012