Я использую Java, JSP и Jetty для разработки веб-сайта.
У меня возникла проблема с путями изображений, переданными в src тегов <img>.
В моей базе данных у меня есть абсолютный путь Linux к изображениям пользователей. Я получаю это значение и помещаю его в атрибут "src".
У меня есть путь, например:
/главная/веб-сайт/изображения/image1.png
Таким образом, изображение не появляется. Долго размышляя, я пришел к выводу, что это естественно, потому что я никогда не видел ни на одном сайте изображения с таким путем к абсолютному пути ОС.
Что мне нужно знать, что я должен делать?
Должен ли я изменить конфигурацию Jetty? Должен ли я запускать какой-то код на Java?
Поискав в гугле, я еще больше запутался. Я хотел бы объяснения.
Действительно, <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 это будет следующим, если вы управляете им программно:
Судя по словам, которые вы использовали в своем URI, похоже, что вы указываете путь к файлу в файловой системе в атрибуте src вместо URL-адреса, который однозначно идентифицирует ресурс.
Абсолютные пути не являются абсолютными из вашей файловой системы, они абсолютны из корня вашего веб-сервера. Кроме того, эти идентификаторы ресурсов URL-адресов можно даже изменить или модифицировать для сопоставления с различными папками на вашем сервере или даже с динамическими ресурсами.
Вот пример:
Путь к файлу на сервере:
/home/website/images/image1.png
example.com сопоставлен с папкой "веб-сайт":
При использовании относительного URL-адреса вы, возможно, видите:
<img src="/images/image1.png" />
Чтобы использовать абсолютный URL, вам понадобится схема HTTP:
Таким образом, использование путей к файлам для идентификации ресурсов на вашем сервере с помощью HTML на стороне клиента просто неверно и не будет работать.