项目中遇到了图片显示的问题,查了很多资料也没个完整能用的,特此记录下来!
场景如下:
上传的图片文件夹在某个盘符下面,把图片上传到upload文件夹,如(d:/upload),然后显示图片的时候用流读取!
jsp页面代码:
<meta http-equiv="Pragma" content="no-cache"> //用流读取的时候,浏览器会去取缓存的数据,尤其是图片,不会重新去请求,所以有的时候显示不出来,原理跟验证码的实现同理,一般获取验证码的时候请求条件会加上当前时间,因为时间时刻在变化,所以每次都能重新请求。所以在这种情况下让刷新jsp页面的时候就清空缓存。
<img alt="" src=".../showImage.do?pic_addr=a.jpg"/>
逻辑处理代码:
/**
* 显示图片
* @param pic_addr 数据库中存储的文件名称
* @return
*/
@RequestMapping("showImage")
public void showImage(HttpServletRequest re,HttpServletResponse response,String pic_addr){
if(null != pic_addr && !"".equals(pic_addr)){
//设置文件类型
response.setContentType("image/*");
response.setHeader("Cache-control", "no-cache");
FileInputStream fis = null;
OutputStream os = null;
//获取文件路径
pic_addr = cacheService.queryParam("ENOCP_SAVE_FILE") + File.separator + pic_addr;
try {
//读取文件并输出
fis = new FileInputStream(new File(pic_addr));
os = response.getOutputStream();
int count = 0;
byte[] buffer = new byte[1024];
while ( (count = fis.read(buffer)) != -1 ){
os.write(buffer, 0, count);
os.flush();
}
}catch(Exception e){
e.printStackTrace();
}finally {
try {//关闭流
if(null != fis){
fis.close();
}
if(null != os){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
此段代码中红色笔记语句是重点,我就是这句没加上,挣扎了好久,小语句,大问题!需注意!
cacheService.queryParam("ENOCP_SAVE_FILE") 此语句是得到上传的文件夹路径,即(d:/upload)
由以上就能完整的显示图片了。
下面再附上上传的代码:
/**
* 上传封面图片
* @param
* @return 返回保存在数据库中的文件名
*/
@Override
public String uploadImgPlan(MultipartFile file, HttpServletRequest request,ICacheService cacheService) {
//有文件的场合才上传
String fileName = "";
if(file.getSize() != 0){
// 从缓存获取文件存储路径
String reportPath = cacheService.queryParam("ENOCP_SAVE_FILE");
// 格式:时间戳.后缀名
fileName = System.currentTimeMillis()//返回以毫秒为单位的当前时间
+ file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
String filePath = reportPath+ File.separator + fileName;
try{
//写文件操作
InputStream fis = file.getInputStream();
FileOutputStream fos = new FileOutputStream(new File(filePath));
byte[] bbs = new byte[10240];//10兆
int len = -1;
while(-1 != (len=fis.read(bbs))){
fos.write(bbs,0,len);
}
fos.close();
fis.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
return fileName;//返回保存在数据库中的文件名
}