我有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,所以它似乎可以正常服务。选定的响应标头
它尝试了各种我能想到的东西,却无法让它发挥作用,你能帮我让它发挥作用吗?
选项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);
}