Alexiuscrow
@Alexiuscrow

Как передать изображения на клиент?

Есть restful сервис и есть android клиент.
Текстовой информацией между сервером и клиентом обмениваюсь с помощью json-а. Но появилась необходимость клиенту получить изображения с сервера. На стороне сервера вся информация (включая изображения) хранится в БД.
Каким образом отправлять изображения на сторону клиента?
Первое что приходит в голову:
  1. вытащить изображения с бд в директорию
  2. получить url для каждой
  3. сформировать json с адресами изображений и дополнительными данными
  4. передать клиенту
  5. получить изображения по адресам указанным в json

Прошу поделится соображениями. Спасибо.
P.S. вместе с изображениями нужно передавать дополнительную информацию (дискрипшн).
  • Вопрос задан
  • 8177 просмотров
Решения вопроса 1
timych
@timych
Ход мыслей у вас правильный - в 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();
	}
}

Почти подобным образом можно и через рест ресурс отдать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы