gpt4 book ai didi

Spring将图像返回为 ResponseEntity - 图像损坏

转载 作者:行者123 更新时间:2023-12-05 01:02:38 40 4
gpt4 key购买 nike

我正在开发一个 spring 3.2.7 应用程序,它通过输出字节数组 ResponseEntity 的 spring Controller 将存储在数据库中的签名作为 base64 字符串发送回用户浏览器。

图像总是损坏,我没有在系统的这部分工作,因为我在 svn 中进行了双重检查,并且自从我正在处理的分支创建以来, Controller 没有被触及。

我能够将 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 {

最佳答案

我已经在 InputStream 的帮助下成功返回了文件内容:

@RequestMapping(value = "/submissions/signature/{type}/{id}", 
method = RequestMethod.GET)
public HttpEntity getFile(HttpServletResponse response,
@PathVariable String type,
@PathVariable Integer id) {
String base64 = "foo"; // get base-64 encoded string from db
byte[] bytes = Base64.decodeBase64(base64);
try (InputStream inputStream = new ByteArrayInputStream(bytes)) {
StreamUtils.copy(inputStream, response.getOutputStream());
response.setContentType(MediaType.IMAGE_PNG_VALUE);
} catch (IOException e) {
// handle
}
return new ResponseEntity(HttpStatus.OK);
}

请注意,我没有使用 ResponseBody,在我的工作版本中,我使用的是 MediaType.APPLICATION_OCTET_STREAM_VALUE 而不是实际的文件内容类型。

关于Spring将图像返回为 ResponseEntity<byte[]> - 图像损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31313303/

40 4 0