我有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被转移,所以它似乎服务正常。选定的响应标题
它尝试了各种我能想到的东西,却无法使它发挥作用。你能帮我把它搞定吗?
答案 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);
}