Атрибут src
элемента HTML <img>
должен указывать на URL, а не на путь к файловой системе локального диска. HTML-страница загружается с сервера на клиентский компьютер и анализируется на клиентском компьютере. Любые URL-адреса, которые встречаются на странице HTML (например, Javascripts, Stylesheets, Images и т. Д.), Будут повторно вызываться со стороны клиента. Если клиент обнаружит путь к файловой системе локального диска, он попытается найти файл в своей собственной файловой системе локального диска. Это не сработает, если сервер и клиент - физически разные машины.
В вашем конкретном случае есть два способа решения этой проблемы.
Добавьте новый контекст веб-приложения к сервлетконтейнеру с единственной целью - обслуживать статические файлы. Непонятно, какой сервлет-контейнер вы используете, но это Tomcat, и все, что вам в основном нужно сделать, это добавить следующий элемент Context
в /conf/server.xml
:
<Context docBase="/path/to/images" path="/images" />
Таким образом, они будут доступны для http://example.com/images/....
.
Создайте класс Servlet
, который использует java.io.File
для получения InputStream
файла изображения и записывает его в OutputStream
ответа. Вы можете использовать параметры запроса или pathinfo для идентификации изображения. Вот базовый пример такого сервлета:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String filename = URLDecoder.decode(request.getPathInfo(), "UTF-8");
File file = new File("/path/to/images", filename);
response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength(file.length());
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(new FileInputStream(file));
output = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[8192];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) try { output.close(); } catch (IOException ignore) {}
if (input != null) try { input.close(); } catch (IOException ignore) {}
}
}
Отобразите это в web.xml
на url-pattern
, например, /images/*
. Таким образом, вы можете получить доступ к изображениям, например, http://example.com/images/filename.jpg
.
<img src="/images/filename.jpg">
Другой пример сервлета изображения можно найти здесь .