关于项目中上传图片时图片尺寸和大小的判断问题
获取页面中图片的尺寸有以下2种思路:
1,在前台页面,通过JS获取;
2,在后台通过文件流获取;
首先来看第一种,在前台页面中获取,首先谷歌浏览器是没有问题的,可以获取到图片的尺寸,无论是页面加载完成后显示的图片,还是JS生成的图片,比如预览图片。但是IE浏览器只能获取到页面加载完成以后显示的图片,没法获取到预览图片的尺寸。这个主要是IE浏览器的为了安全性考虑的。
优点:在前台通过JS获取,减轻服务器压力;
缺点:浏览器兼容性问题、存在被攻击的风险,安全性不如后台;
通过项目中实践,建议采用第二种思路,也就是在后台通过文件流获取图片的宽高和大小。
优点:不存在浏览器兼容性问题;
缺点:服务器端校验,增加了服务器端的压力;
示例代码:
InputStream fileIs = null;
if(fileIs != null){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
InputStream inputStream = null;
try {
byte[] buffer = new byte[1024];
int len;
while ((len = fileIs.read(buffer)) > -1 ) {
byteArrayOutputStream.write(buffer, 0, len);
}
baos.flush();
inputStream = new ByteArrayInputStream(baos.toByteArray());
BufferedImage buff;
buff = ImageIO.read(inputStream);
int width = buff.getWidth(); //获取上传图片的宽度
int height = buff.getWidth(); //获取上传图片的高度
int newwidth = 0;
if(!"".equals(dbmimgwidth) && dbmimgwidth != ""){
newwidth = Integer.parseInt(dbmimgwidth); //获取页面中的图片的宽度
}
if(0 != newwidth && newwidth != width){
throw new NewException("图片宽度不一致!!!");
}
fileIs = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
} catch (IOException e) {
logger.error("获取图片宽度和高度失败.......");
throw new NewException("获取图片宽度和高度失败,保存失败!");
}finally{
try {
if(inputStream != null){
inputStream.close();
}
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
根据以往的项目经验,图片的尺寸和大小的控制,最好选择在后台,通过文件流操作来获取,这样可以有效避免浏览器的兼容性问题和安全性问题。以上仅为一家之言,仅供参考,如有不对之处,请多包含。
分享一首刘禹锡的诗:《闻乐天扬州初逢席上见赠》
巴山蜀水凄凉地,二十三年弃置身。
怀旧空吟闻笛赋,到乡翻似烂柯人。
沉舟侧畔千帆过,病树前头万木春。
今日听君歌一曲,暂凭杯酒长精神。