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

时间:2016-10-31 15:09:31

标签: html image encoding spring-boot base64

我有base64编码的图像(例如gif)。我希望通过Spring-Boot网络为他们提供服务,而无需在服务器端解码它们。客户端应该进行base64解码。很明显,浏览器可以做到这一点。仔细看看https://jsfiddle.net/casiano/xadvz/。在img-tag的src中内嵌base64编码的图像,它可以正常工作。现在假设我在服务器上的文件中有该base16编码的图像(myfile_gif.txt,内容为" R0lG ... hAAOw ==")。

我想通过Spring-Boot网络提供该文件myfile_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();
        }
    }
}

但它不起作用 - 图像不会在浏览器中显示。我可以在浏览器的Developer-console中看到对http://localhost:8080/rest/testimage的请求获得响应代码200并且它说2,54kb被转移,所以它似乎服务正常。选定的响应标题

  • 内容编码:base64
  • 转移编码:base64,chunked
  • Content-Type:image / gif; charset = UTF-8

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

1 个答案:

答案 0 :(得分:0)

选项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);
}