【发布时间】:2015-07-09 09:22:58
【问题描述】:
我正在开发一个 spring 3.2.7 应用程序,它通过输出字节数组 ResponseEntity 的 spring 控制器将存储在数据库中的签名作为 base64 字符串发送回用户浏览器。
图像总是损坏,我没有在系统的这部分工作,因为我仔细检查了 svn,并且自从我正在处理的分支创建以来,控制器没有被触及。
我能够将 base64 字符串转换为桌面上的图像,并且我还能够在 spring 介入之前将返回到浏览器的字节数组转换为图像。
下面是我的代码,这显然之前工作过,所以也许有一些配置更改可能导致这种情况?
@RequestMapping(value = "/submissions/signature/{type}/{id}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> getSignature(@PathVariable String type, @PathVariable Integer id) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String base64 = ... gets from db
byte[] bytes = Base64.decodeBase64(base64);
BufferedImage bi = ImageIO.read(new ByteArrayInputStream(bytes));
ImageIO.write(bi, "png", baos);
HttpHeaders headers = new HttpHeaders();
headers.setLastModified(Calendar.getInstance().getTime().getTime());
headers.setCacheControl("no-cache");
headers.setContentType(MediaType.IMAGE_PNG);
headers.setContentLength(baos.toByteArray().length);
//Image as base64 string is ok in converter
System.out.println("BASE 64 IMAGE IS: " + base64);
//This image is created ok on desktop
FileOutputStream fos = new FileOutputStream("C:\\Users\\p\\Desktop\\test_signature.png");
fos.write(bytes);
fos.close();
//This image is created ok on desktop
FileOutputStream fos3 = new FileOutputStream("C:\\Users\\p\\Desktop\\test_signature_baos.png");
fos3.write(bytes);
fos3.close();
return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.OK);
}
图像正在浏览器中呈现,例如:
<img id="userSignature" width="296" height="110" style="border:0px" src="/webapp/service/submissions/signature/user/${subid}" alt="User signature" />
我没有更改这个类,我被告知它确实有效,我能够从两个字节数组创建图像,它们没问题,看起来一样,我可以渲染签名字符串以进行测试,例如:
<IMG SRC="data:image/png;base64, <base_64_string>" ALT="">
有没有人遇到过类似的问题或知道是什么原因造成的?
我现在尝试从已创建为 png 的文件系统发送图像,但也失败了。
我现在注意到 CSV 文件无法在应用中正确下载,并且它们以相同的方式流式传输:
@RequestMapping(value = "/results/csv", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> getResultsInCsvFormat() throws IOException {
【问题讨论】:
-
查看您的代码,我完全不确定您为什么要使用
ImageIO;您可以直接发送bytes作为响应的一部分并完全省略bi和baos,例如return new ResponseEntity<byte[]>(bytes ...) -
我实际上不是我的一个同事写的有改变的原因吗?显然 ByteArrayHttpMessageConverter 是自动注册的,因为我在设置该 bean 的配置中没有任何内容。