在MongoDB中用jsp春季显示图像
问题内容:
我需要从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>
最后,控制器被正确调用,但是错误必须在它内部。
提前Thx
问题答案:
最终,我自己达成了一个解决方案,将其发布,以便其他人可以解决:
控制器部分
@RequestMapping(value = "/getPhoto", method = RequestMethod.GET)
public @ResponseBody
void getPhoto(HttpServletRequest request,
HttpServletResponse response) {
try {
GridFSDBFile imageForOutput = userFacade.loadProfilePhoto((User) SecurityContextHolder.getContext().getAuthentication()
.getPrincipal());
InputStream is = imageForOutput.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[]imagenEnBytes = buffer.toByteArray();
response.setHeader("Accept-ranges","bytes");
response.setContentType( "image/jpeg" );
response.setContentLength(imagenEnBytes.length);
response.setHeader("Expires","0");
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-Description","File Transfer");
response.setHeader("Content-Transfer-Encoding:","binary");
OutputStream out = response.getOutputStream();
out.write( imagenEnBytes );
out.flush();
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
JSP视图
<c:url var="getPhoto" value="/settingsAdmin/getPhoto" />
<div id="preview">
<img id="imagePreview" src="${getPhoto}"alt="Profile Photo"/>
</div>
谢谢你们每一个人的帮助