日期:2014-05-18  浏览次数:20599 次

请大家帮帮我,从数据库中直接读图片显示到页面,后台数据和前台页面不同步的问题.
在我的项目中.用户会录入很多车辆的信息并且会上传每辆车辆的照片.我用hibernate直接把图片以blob的形式保存到oracle数据库中.然后我需要在另一个页面中显示车辆的信息和用户上传的车辆照片.这时,我就从数据库中把图片取出来,然后放到一个路径下,图片是可以显示,但是有一个奇怪的问题:当我点击第一辆车的信息,显示图片正常,然后再点一第二辆车的信息,显示的图片和第一辆车的图片相同!!但是我查了一下数据库两辆车的照片是不同的!然后我在后台跟踪了图片的大小,结果显示每次读取的图片确实都不一样.但是在页面上显示的图片总是和第一个车辆的相同.为此.我清除了一下ie缓存,才可以正常显示!但是在显示不同车辆照片之前必须要清楚一下缓存才行.不然显示的图片总是第一辆车的图片.为此我在后台代码中清除了缓存并且在现实车辆图片的页面中都清楚了缓存,但是还是不行.!不知道问题错在哪里,一下是我的代码!
//获得图片存放的路径sb.每读出一次车辆照片就显示在这个路径下,并且把上次读出的那个图片给覆盖掉.
StringBuffer sb = new StringBuffer(request.getSession().getServletContext().getRealPath("/"));
sb.append(Globals.upload);
sb.append("/property/carManager/");
String id=request.getParameter("id");
Carbaseinfo baseInfo=null;
if(id!=null || !"".equals(id)) {
baseInfo=manager.findById(id); //获得一个车辆对象,
}
//刚开始我还以为是页面缓存的问题,就清除了一下缓存,结果不是.但是我在ie中,每清除一下缓存显示的图片 就正确一次,奇怪了....
response.setHeader("Pragma","No-cache"); //没写错吗?
response.setHeader("Cache-Control","no-cache"); //没写错吗?
response.setDateHeader("Expires", 0); //没写错吗?
//用流把图片从数据库中读出来
byte[] buf=baseInfo.getPhoto();//我在这里跟踪从数据库中读出的图片,每次读出的图片大小都不一样,但是在页面上显示的却一样!!!
File file=new File(sb+"/carBaseInfoDetail");创建车辆图片文件名为carBaseInfoDetail(没有扩展名),并且覆盖掉上次的图片
OutputStream os = new FileOutputStream(file);  
ByteArrayInputStream in = new java.io.ByteArrayInputStream(buf);
in.read(buf);  
os.write(buf); //问题出在这里吗?是不是流还没有读完或者写完.??
  in.close();
  os.close(); 
  //把图片发到request内,以便可以在页面中显示出来.
request.setAttribute("photo","../../upload/property/carManager/carBaseInfoDetail");
mapping.findforward("showInfo")


显示图片的页面:
<%response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache"); 
response.setDateHeader("Expires", 0); %>
</head>
....
<td align="center" valign="middle" width="100" rowspan="5"><img src="<bean:write name='photo'/>" align="middle" width="160"/></td>
....


这个问题太奇怪了.真不应该直接把图片放到数据库中.
请大家帮帮我.

------解决方案--------------------
你图片的名字都是相同的吗?这个浏览器端做缓存了
你可以试一下每个文件名都不相同应该就可以了.比如用id把图片都区分开