2010-07-07 3 views
3

У меня есть сервлет, который служит файлу изображения, который был сохранен в блобе. Если запрошенное изображение не может быть найдено, я хотел бы загрузить статическое изображение, которое я включил в свой военный каталог. как нам это сделать? Это, как я служу блобы изображениям из хранилища данных:Обслуживание изображения из моего военного каталога?

public class ServletImg extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    { 
    MyImgWrapper obj = PMF.get().getPersistenceManager(). 
     getObjectById(MyImgWrapper.class, 'xyz'); 
    if (obj != null) { 
     resp.getOutputStream().write(obj.getBlob().getBytes()); 
     resp.getOutputStream().flush(); 
    } 
    else { 
     // Here I'd like to serve an image from my war file. 
     /war/img/missingphoto.jpg 
    } 
    } 
} 

да я просто не знаю, как получить изображение байт из образа в моей военной директории, или, если есть какой-то другой способ сделать Это?

Благодаря

ответ

3

Другие ответы рекомендуют ClassLoader#getResourceAsStream() ожидают, что изображение находится в поле classpath. Однако вы также можете получить изображение с веб-сайта с использованием ServletContext#getResourceAsStream(). ServletContext доступен в сервлетах по унаследованному методу getServletContext().

InputStream input = getServletContext().getResourceAsStream("/img/missingphoto.jpg"); 

Тем не менее, чтение и запись полностью в/из byte[] не очень память эффективно. Рассмотрим потоковое через небольшой байт буфера (1 ~ 10kb) как так:

input = getServletContext().getResourceAsStream(path); 
output = response.getOutputStream(); 
byte[] buffer = new byte[1024]; 
for (int length = 0; (length = input.read(buffer)) > 0;) { 
    output.write(buffer, 0, length); 
} 
+0

Хорошо, это работает отлично - мне просто интересно, даст ли решение splix лучшую производительность (http redirect)? Думаю, браузер должен будет сделать еще один запрос, так что в целом он будет медленнее? Спасибо – user246114

+0

Разница в производительности незначительна. По крайней мере, перенаправление делает невозможным установить статус ответа на 404 (вызывать 'response.setStatus (HttpServletResponse.SC_NOT_FOUND);' перед записью в выходной поток). Статус ответа имеет смысл для поисковых роботов и так далее. – BalusC

1

Следовать Haveacafe-х tutorial.

2-й результат для Google: java war file resource.

+0

Ах да, что похоже, что стробоскоп также рекомендует, просто не уверен, что путь должен быть для ресурса? – user246114

1

Я предлагаю вам использовать загрузчик классов для извлечения файла.

ClassLoader classLoader = this.getClass().getClassLoader(); 
InputStream in = classLoader.getResourceAsStream(fileNameInClasspath); 
... 
+0

Как я узнаю, что такое fileNameInClasspath? Путь изображения: [war/img/test.jpg] – user246114

0

Лучший способ в этом случае будет просто перенаправлять http-перенаправление (статус 301) на URL этого изображения.