返回图像AWS S3(S3Object)Spring REST控制器

时间:2018-05-14 09:54:13

标签: java spring amazon-web-services amazon-s3

我试图从我的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 :(得分:1)

尝试使用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;

}

答案 1 :(得分:0)

可能是一个愚蠢的问题,但你是否确定图像的MIME类型实际上是PNG?也许浏览器一直在进行一些MIME嗅探,并且在它所发现的广告内容类型与文件格式之间的混淆之间会有所混淆?我看到你设置了X-Content-Type-Options: nosniff,但我很想知道首先确保文件格式正确。

答案 2 :(得分:0)

answered对类似问题之一,它与PDF有关。如果您只是将MediaType更改为PNG / JPEG,它应该可以工作。看看吧。