Ход мыслей у вас правильный - в DTO кладете весь дескрипшн и линк на сервис выдающий изображения. Например
myservice.myimageresource?imgId=12345.
Ресурс может быть либо сервлетом либо рест ресурсом. Картинку берете из базы и сразу отдаете байтовым потоком клиенту по GET запросу. Писать во временную папку не надо.
В ответ на ваш коммент отредактировал тут -так как тут есть теги для кода.
Вот сильно упрощенный пример сервлета, отдающего картинку.
public class PreviewServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// это ваше DAO
private PreviewService previewService = Fascade.getPreviewService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/jpeg");
//парсим id картинки из запроса
int imageId = Integer.parseInt(request.getParameter("id"));
//Тут вы получаете Entity вашей картинки, одно из полей у которого является массивом байт
Preview preview = previewService.getByImageId(imageId);
byte[] bytes = preview.getBytes();
response.setContentLength((int) bytes.length);
// получаете поток для своих нужд
ServletOutputStream outStream = response.getOutputStream();
// отсылаете картинку на клиента
outStream.write(bytes);
// закрываете поток
outStream.close();
}
}
Почти подобным образом можно и через рест ресурс отдать.