Возвращаемое изображение AWS S3 (S3Object) Spring REST контроллер - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь вернуть изображения из моей корзины S3. Все работает отлично, мой сервис загружает и получает изображения, но проблема в том, что когда я пытаюсь вернуть их через контроллер REST, изображение не отображается в браузере.

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

public S3Object getImageFromS3Bucket(String fileName) {
    S3Object object = s3client.getObject(new GetObjectRequest(bucketName, fileName));
    return object;
}

public byte[] getByteArrayFromImageS3Bucket(String fileName) throws IOException {
    InputStream in = getImageFromS3Bucket(fileName).getObjectContent();
    byte[] byteArray = IOUtils.toByteArray(in);
    in.close();

    return byteArray;
}

и вот мой контроллер:

@RequestMapping(value = "/getImage/{fileName}", method = RequestMethod.GET)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public ResponseEntity<byte[]> downloadImage(@PathVariable("fileName") String fileName) throws IOException {
    byte[] media = s3BucketTestService.getByteArrayFromFile(fileName);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.IMAGE_PNG);
    headers.setContentLength(media.length);

    return new ResponseEntity<>(media, headers, HttpStatus.OK);
}

Вот заголовки ответа:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 10645
Content-Type: image/png
Date: Mon, 14 May 2018 09:41:47 GMT
Expires: 0
Pragma: no-cache
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

У меня также есть этот bean-компонент в моей конфигурации:

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

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

Кто-нибудь знает, что я делаю не так? Браузер создает изображение в формате png с точным размером файла, который я пытаюсь получить, поэтому я думаю, что единственная проблема - это визуализация изображения?

PD: Я не хочу, чтобы изображение загружалось, я просто хочу сгенерировать этот ресурс, чтобы клиент мог его прочитать.

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Попробуйте использовать ImageIO API для преобразования необработанных байтов из корзины S3 в байты изображения, как показано ниже:

public byte[] getByteArrayFromImageS3Bucket(String fileName) throws IOException {
    InputStream in = getImageFromS3Bucket(fileName).getObjectContent();

    BufferedImage imageFromAWS = ImageIO.read(in);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(imageFromAWS, "png", baos );
    byte[] imageBytes = baos.toByteArray();
    in.close();
    return imageBytes;

}
0 голосов
/ 14 мая 2018

I ответил на один из похожих вопросов, это было связано с PDF. Если вы просто измените MediaType на PNG / JPEG, он должен работать. Посмотрите на это.

0 голосов
/ 14 мая 2018

Возможно, это глупый вопрос, но уверены ли вы, что тип изображения MIME на самом деле PNG? Возможно, браузер делает какой-то анализ MIME и запутывается между тем, что он находит в рекламируемом типе контента, а не в том, какой формат файла кажется? Я вижу, вы установили X-Content-Type-Options: nosniff, но мне просто интересно сначала убедиться, что формат файла правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...