Рубрики
Без рубрики

Возвращение изображений/медиа данных с помощью весеннего MVC

В статье показаны альтернативы для возвращения изображения (или других средств массовой информации) с Spring MVC и обсуждается плюсы и минусы каждого подхода.

Автор оригинала: baeldung.

1. Обзор

В этом учебнике мы иллюстр сделаем иллюстрацию того, как возвращать изображения и другие средства массовой информации с помощью платформы Spring MVC.

Мы обсудим несколько подходов, начиная от прямого манипулирования HttpServletРеспонирование чем переход к подходам, которые извлекают выгоду Коэффициент преобразования , Переговоры по контенту и Весенний Ресурсное абстракция. Мы внимательно рассмотрим каждый из них и обсудим их преимущества и недостатки.

2. Использование httpServletРеспонс

Самый простой подход загрузки изображения заключается в непосредственной работе против ответ объект и имитировать чистую Сервлет реализации и продемонстрирована с использованием следующего фрагмента:

@RequestMapping(value = "/image-manual-response", method = RequestMethod.GET)
public void getImageAsByteArray(HttpServletResponse response) throws IOException {
    InputStream in = servletContext.getResourceAsStream("/WEB-INF/images/image-example.jpg");
    response.setContentType(MediaType.IMAGE_JPEG_VALUE);
    IOUtils.copy(in, response.getOutputStream());
}

Выдача следующего запроса сделает изображение в браузере:

http://localhost:8080/spring-mvc-xml/image-manual-response.jpg

Реализация довольно проста и проста из-за IOUtils из org.apache.commons.io пакет. Однако недостатком этого подхода является то, что он не является надежным против потенциальных изменений. Тип пантомимы жестко закодирован, и изменение логики преобразования или экстернализации местоположения изображения требует внесения изменений в код.

В следующем разделе обсуждается более гибкий подход.

3. Использование httpMessageConverter

В предыдущем разделе обсуждался базовый подход, который не использует функции преобразования сообщений и согласования содержимого в весенней раме MVC. Для загрузки этих функций мы должны:

  • Аннотировать метод контроллера с помощью @ResponseBody аннотация
  • Зарегистрируйте соответствующий преобразователь сообщений на основе типа возврата метода контроллера ( ByteArrayHttpMessageConverter например, необходимые для правильного преобразования массива байтов в файл изображения)

3.1. Конфигурация

Для демонстрации конфигурации преобразователей мы будем использовать встроенный ByteArrayHttpMessageConverter преобразует сообщение всякий раз, когда метод возвращает byte- тип.

ByteArrayHttpMessageConverter регистрируется по умолчанию, но конфигурация аналогична любому другому встроенному или пользовательскому преобразовательу.

Применение фасоли преобразователь сообщения требует регистрации соответствующего СообщениеКонвертер фасоль внутри контекста Spring MVC и настройка типов мультимедиа, которые она должна обрабатывать. Вы можете определить его через XML, используя тег.

Этот тег должен быть определен внутри тег, как в следующем примере:


    
        
            
                
                    image/jpeg
                    image/png
                
            
        
    

Вышеупомянутая часть конфигурации будет ByteArrayHttpMessageConverter для изображение/jpeg и изображение/ типы содержимого ответов. Если тег не присутствует в конфигурации mvc, после чего будет зарегистрирован набор преобразователей по умолчанию.

Кроме того, можно зарегистрировать конвертер сообщения с помощью Java- :

@Override
public void configureMessageConverters(List> converters) {
    converters.add(byteArrayHttpMessageConverter());
}

@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
    ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
    arrayHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes());
    return arrayHttpMessageConverter;
}

private List getSupportedMediaTypes() {
    List list = new ArrayList();
    list.add(MediaType.IMAGE_JPEG);
    list.add(MediaType.IMAGE_PNG);
    list.add(MediaType.APPLICATION_OCTET_STREAM);
    return list;
}

3.2. Осуществление

Теперь мы можем реализовать наш метод, который будет обрабатывать запросы на средства массовой информации. Как уже упоминалось выше, необходимо отметить метод контроллера с помощью @ResponseBody аннотация и использование byte- как возвращающийся тип:

@RequestMapping(value = "/image-byte-array", method = RequestMethod.GET)
public @ResponseBody byte[] getImageAsByteArray() throws IOException {
    InputStream in = servletContext.getResourceAsStream("/WEB-INF/images/image-example.jpg");
    return IOUtils.toByteArray(in);
}

Чтобы протестировать метод, выдать следующий запрос в браузере:

http://localhost:8080/spring-mvc-xml/image-byte-array.jpg

С другой стороны, метод ничего не знает о HttpServletРеспонс, процесс преобразования очень настраивается, начиная от использования доступных преобразователей и конкретизировать пользовательский. Тип содержимого ответа не должен быть жестко закодирован, скорее он будет переговоры на основе суффикса пути запроса .jpg .

Недостатком этого подхода является то, что вам нужно явно реализовать логику для получения изображения из источника данных (локальный файл, внешнее хранилище и т.д.), и вы не можете контролировать заготовки или код статуса ответа.

4. Использование класса responseEntity

Вы можете вернуть изображение как byte- завернутый в ОтветНая организация . Весенний MVC ОтветВечность позволяет контролировать не только тело ответа HTTP, но и заголовок и код статуса ответа. Следуя этому подходу, необходимо определить тип возврата метода как ResponseEntity<быть и > возвращающиеся ОтветВечность объект в корпусе метода.

@RequestMapping(value = "/image-response-entity", method = RequestMethod.GET)
public ResponseEntity getImageAsResponseEntity() {
    HttpHeaders headers = new HttpHeaders();
    InputStream in = servletContext.getResourceAsStream("/WEB-INF/images/image-example.jpg");
    byte[] media = IOUtils.toByteArray(in);
    headers.setCacheControl(CacheControl.noCache().getHeaderValue());
    
    ResponseEntity responseEntity = new ResponseEntity<>(media, headers, HttpStatus.OK);
    return responseEntity;
}

Использование ОтветВечность позволяет настроить код ответа для данного запроса.

Явное установление кода ответа особенно полезно перед лицом исключительного события, например, если изображение не было найдено ( FileNotFoundException ) или поврежден ( IOException) . В этих случаях все, что необходимо, это установить код ответа, например, новый ResponseEntity<> (null, headers, HttpStatus.NOT_FOUND), в адекватном блоке улова.

Кроме того, если вам нужно установить некоторые конкретные загоны в ответ, этот подход является более простым, чем установка заготовок с помощью HttpServletРеспонирование объект, который принимается методом в качестве параметра. Это делает подпись метода ясной и целенаправленной.

5. Возвращение изображения с использованием класса ресурсов

Наконец, вы можете вернуть изображение в виде Ресурсное объект.

Ресурсное интерфейс — это интерфейс для абстрагирования доступа к низкоуровневым ресурсам. Он вводится весной в качестве более способной замены стандартной java.net.URL класс. Это позволяет легко получить доступ к различным типам ресурсов (локальные файлы, удаленные файлы, ресурсы класса) без необходимости писать код, который явно получает их.

Для использования этого подхода тип возврата метода должен быть установлен для Ресурсное и вы должны аннотировать метод с @ResponseBody аннотация.

5.1. Осуществление

@ResponseBody
@RequestMapping(value = "/image-resource", method = RequestMethod.GET)
public Resource getImageAsResource() {
   return new ServletContextResource(servletContext, "/WEB-INF/images/image-example.jpg");
}

или, если мы хотим больше контроля над заготовки ответа:

@RequestMapping(value = "/image-resource", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity getImageAsResource() {
    HttpHeaders headers = new HttpHeaders();
    Resource resource = 
      new ServletContextResource(servletContext, "/WEB-INF/images/image-example.jpg");
    return new ResponseEntity<>(resource, headers, HttpStatus.OK);
}

Используя этот подход, вы рассматриваете изображения как ресурсы, которые могут быть загружены с помощью Ресурсоснабжатель реализации интерфейса. В таком случае вы абстрагироваться от точного местоположения вашего изображения и Ресурсоснабжатель решает, откуда он загружается.

Он обеспечивает общий подход к контролю местоположения изображений с помощью конфигурации и устраняет необходимость написания кода загрузки файлов.

6. Заключение

Среди вышеупомянутых подходов мы начали с базового подхода, а затем использовали подход, который выигрывает от функции преобразования сообщений в рамках. Мы также обсудили, как получить набор кода ответа и заготовки ответов, не передавая объект ответа напрямую.

Наконец, мы добавили гибкость с точки зрения местоположения изображения, потому что где получить изображение из, определяется в конфигурации, которая легче изменить на лету.

Скачать изображение или файл с spring объясняет, как достичь того же с помощью Spring Boot.

Образец кода после учебника доступен по GitHub .