【发布时间】:2014-04-03 20:35:25
【问题描述】:
我需要从 MongoDB GridFS 系统获取图像,然后将其显示在 JSP img 标记中。 这是我的代码不起作用:
@RequestMapping(value = "/getPhoto", method = RequestMethod.GET)
public @ResponseBody
void getPhoto(HttpServletRequest request,
HttpServletResponse response) {
try {
System.out.println("getting photo...");
GridFSDBFile imageForOutput = userFacade.loadProfilePhoto((User) SecurityContextHolder.getContext().getAuthentication()
.getPrincipal());
BufferedImage image = ImageIO.read(imageForOutput.getInputStream());
byte[] imageBytes = ((DataBufferByte) image.getData().getDataBuffer()).getData();
response.setHeader("expires", "0");
response.setContentType("image/jpg");
response.setContentLength(imageBytes.length);
OutputStream out = response.getOutputStream();
out.write(imageBytes, 0, imageBytes.length);
out.flush();
out.close();
return;
} catch (Exception e) {
// TODO Auto-generated catch block
}
首先我得到 GridFSDBFile,然后我需要得到 byte[]。之后我把它写在响应对象中,但我不知道我是否做得正确。
JSP中的代码如下:
<c:url var="getPhoto" value="/settingsAdmin/getPhoto" />
<div id="preview">
<img id="imagePreview" src="${getPhoto}" alt="Profile Photo"/>
</div>
最后,控制器被正确调用,但错误一定在里面。
提前谢谢
【问题讨论】:
-
这里的方法不是很好。您应该不在标记中嵌入图像数据。您应该使用控制器端点来模拟文件。一般做法如图here
-
对JSP不太了解。究竟是什么错误?你看不到图像还是什么?如果您想将图像数据嵌入到
标记中,这里是一个example。不过,这绝对不是一个好主意。
-
问题是img没有显示在视图中,无论如何要从GridfsDbFile中获取Base64字符串以便至少在视图中显示它,这是我第一次这样做
-
这是如何内联的?我认为要内联,您必须将
src属性设置为“数据:”。他所做的只是调用一个 Spring 控制器,该控制器返回一个与从驱动器读取图像相同的二进制文件。 -
那么,这是正确的方法吗?因为我认为这样它也不起作用 out.write(Base64.encode(imageBytes),0,Base64.encode(imageBytes).length);
标签: mongodb jsp spring-mvc servlets gridfs