我写了一个休息控制器来返回与主键相关联的图像。现在我想在浏览器中加载这个图像,我遇到了问题:
(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);
}
答案 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调试后,我能够验证响应主体没有得到正确编码的图像(与标题无关)。
这是由于InputStream
和OutputStream
个对象的选择造成的。
我没有使用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();
}