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

2023-12-30

我正在开发一个 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 {

我已在以下人员的帮助下成功返回了文件内容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而不是实际的文件内容类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 将图像返回为 ResponseEntity - 图像损坏 的相关文章

随机推荐