当前位置: 首页 > 知识库问答 >
问题:

Spring返回映像为responseEntity-映像损坏

袁雅逸
2023-03-14

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

下面是我的代码,这显然是工作之前,所以也许有一些配置变化,可能会导致这一点?

  @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=""> 

我现在注意到CSV文件不能在应用程序中正确下载,它们以相同的方式流:

       @RequestMapping(value = "/results/csv", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> getResultsInCsvFormat() throws IOException {

共有1个答案

姚星宇
2023-03-14

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,而不是实际的文件内容类型。

 类似资料:
  • 问题内容: 有什么方法可以手动下载Docker映像吗? 我的互联网连接速度非常慢,对我来说,最好获得图像的链接,然后以更高的互联网速度将其下载到其他位置, 如何获取由docker pull管理的映像的直接URL? 问题答案: 可能会得到,但让我提出另外两种建议! 如果可以通过快速连接连接到远程服务器,并且该服务器可以运行Docker,则可以在该服务器上,然后将映像(及其所有层和元数据)导出为tar

  • 主要内容:初始程序,执行步骤前面我们已经看到了如何获得进程及其父进程的基本信息,现在来查看进程/程序信息的细节。 进程映像究竟是什么? 进程映像是执行程序时所需的可执行文件。 该图片通常包含以下部分 - 代码段或文本段 数据段 堆栈段 堆段 以下是进程映像的图形表示。参考下图 - 代码段是由可执行指令组成的目标文件或程序虚拟地址空间的一部分。 这通常是只读数据段,具有固定的大小。 数据段有两种类型。分别如下所示 - 初始化

  • 我已经尝试了Stackoverflow中给出的各种方法,也许我错过了什么。 注释后的代码(设置内容类型,取出): 在浏览器中,这似乎只是给了一个字符串化的垃圾(我猜是字节到字符)。在Android中,它不会出错,但图像不会显示。

  • 问题内容: Docker和虚拟机的映像是否存在差异?除了图像格式,我在任何地方都找不到任何信息。请注释掉图像大小,实例创建时间,捕获时间等内容。谢谢! 问题答案: 这些是我可以列出的docker和VM映像之间的一些区别: 1. Docker中的快照过程比VM更快 我们通常从基本映像开始,然后进行更改,然后使用docker提交这些更改,然后创建一个映像。该图像仅包含与基准的差异。当我们要运行图像时,

  • 问题内容: 我有一个泊坞窗映像,我想找出它是从哪个映像创建的。当然有多层,但是我想找出最后一张图像(dockerfile中该图像的FROM语句)? 我尝试使用,但无法在其中找到此信息。 我尝试使用以下命令,但它给我一条错误消息 这是我收到的错误消息 问题答案: 您可以使用此答案中建议的方法:https : //stackoverflow.com/a/53841690/3691891 首先,拉: 获

  • 问题内容: 我们可以使用没有源映像(OS)的docker文件创建docker映像吗 我们不希望在所有应用程序docker映像中使用基本映像(centos或rhel)。我们想要将基本映像(centos或rhel)与应用程序映像分开,并在运行时将它们链接起来。可能吗? 当我 不使用 或构建docker映像时,docker抱怨:“提交前提供源映像” 我的docker文件如下所示: 问题答案: 您说过:“