提问者:小点点

Spring Boot:从文件中提供图像-包含base64编码


我有base64编码的图像(例如gif)。我想通过Spring-Boot web提供它们,而不在服务器端对它们进行base64解码。客户端应该进行base64解码。很明显,浏览器可以做到这一点。简单看一下https://jsfiddle.net/casiano/xadvz/.在img-tag的src中内联base64编码的图像时,它可以正常工作。现在假设我在服务器上的文件(myfile_gif. txt,内容为“R0lG…hAAOw==”)中有该示例中的base64编码图像。

我想通过Spring Boot webmyfile_gif. txt提供该文件,而无需在服务器端将base64解码为二进制文件。它应该以某种方式工作,以便以下html片段实际显示图像

<img src="http://localhost:8080/rest/testimage" />

目前我有以下

@RestController
@RequestMapping("/rest")
public class RestController {
    @RequestMapping(path = "/testimage", method = RequestMethod.GET)
    @ResponseBody
    public HttpEntity<?> getTestImage() {
        InputStream stream = null;
        try {
            stream = new FileInputStream(new File("myfile_gif.txt"));
        } catch (FileNotFoundException e) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }

        if (stream != null) {
            return ResponseEntity.ok()
            .contentType(MediaType.parseMediaType("image/gif;base64"))
            .header(HttpHeaders.CONTENT_ENCODING, "base64")
            .header(HttpHeaders.TRANSFER_ENCODING, "base64")
            .header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"my.gif\"")
            .body(new InputStreamResource(stream));
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
        }
    }
}

但是它不起作用-图像在浏览器中不显示。我可以在浏览器的开发者控制台中看到对http://localhost:8080/rest/testimage的请求得到了响应代码200,它说传输了2,54kb,所以它似乎可以正常服务。选定的响应标头

  • 内容编码:base64
  • 传输编码:base64,分块
  • 内容类型:图像/gif;字符集=UTF-8

它尝试了各种我能想到的东西,却无法让它发挥作用,你能帮我让它发挥作用吗?


共1个答案

匿名用户

选项1:

String base64 = "your file"; // get base-64 encoded string
    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);

选项2:

@RequestMapping("/image/{id}")
@ResponseBody
public HttpEntity<byte[]> getImage(@PathVariable String id) {

   // 1. download img your location... 
    byte[] image = ... 

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.IMAGE_JPEG);
    headers.setContentLength(image.length);

    return new HttpEntity<byte[]>(image, headers);
}