Spring响应实体图像

时间:2018-03-20 20:45:55

标签: spring image rest

我写了一个休息控制器来返回与主键相关联的图像。现在我想在浏览器中加载这个图像,我遇到了问题:

(1)如果我为图像键入GET URL,浏览器(FireFox和Chrome)不会显示图像,但他们正在正确地看到所有标题。此外,firefox说"图像无法显示,因为它包含错误"

(2)如果我使用XMLHttpRequest创建使用URL获取图像我得到图像但它只是部分显示(下半部分被切断并设置为透明)。

@GetMapping("/{featureId}/loadImage")
public ResponseEntity<byte []> loadImageForId(@PathVariable long featureId, HttpServletResponse response) throws IOException {
    log.info("Getting image for feature id " + featureId);
    Feature feature = featureService.getFeatureById(featureId);
    File file = featureService.loadImageForFeature(feature);
    byte [] imageData = new byte[(int) file.length()];
    FileInputStream inputStream = new FileInputStream(file);
    inputStream.read(imageData);
    inputStream.close();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.parseMediaType(...));
    headers.setContentLength(file.length());
    response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
    return new ResponseEntity<byte[]>(imageData, headers, HttpStatus.OK);
}

2 个答案:

答案 0 :(得分:0)

如果它在tomcat上运行,你可以使用这个tomcat的实用程序类:

import org.apache.tomcat.util.http.fileupload.IOUtils

例如:

response.setContentType("image/jpeg");
InputStream is = new ByteArrayInputStream(imageByteArray);
IOUtils.copy(is,response.getOutputStream());

答案 1 :(得分:0)

好的,最后经过几个小时的curl调试后,我能够验证响应主体没有得到正确编码的图像(与标题无关)。

这是由于InputStreamOutputStream个对象的选择造成的。

我没有使用FileInputStream,而是使用ImageIO和基础BufferedImage将输出写入ServletResponse,如下所示:

@GetMapping("/{featureId}/loadImage")
public void loadImageForId(@PathVariable long featureId, HttpServletResponse response) throws IOException {
    log.info("Getting image for feature id " + featureId);
    Feature feature = featureService.getFeatureById(featureId);
    File imageFile = featureService.loadImageForFeature(feature);
    MediaType mediaType = MediaType.parseMediaType(Files.probeContentType(imageFile.toPath()));
    response.setHeader("Content-Disposition", "inline; filename=" + imageFile.getName());
    response.setStatus(HttpStatus.OK.value());
    response.setContentType(mediaType.toString());
    response.setContentLength((int)imageFile.length());
    OutputStream os = response.getOutputStream();
    ImageIO.write(ImageIO.read(imageFile), mediaType.getSubtype(), os);
    os.flush();
    os.close();
}