在最近的项目中,涉及到了附件下载,从影像系统下载附件到本地目录,存储格式自定义(这里就遇到了问题,定义为txt文件导致某些api不能识别文件)。
在我写的浏览附件的接口,支持浏览缩略图以及浏览全图。
现象(问题描述)
BufferedImage prevImage = ImageIO.read(inputStream) 调试跟进去发现prevImage = null,可是输入流是好好的,而且输入流对应的图片也能打开,但 ImageIO.read返回就是null
解决过程
后来在网上查找ImageIO用法知道,它可读取的图片类型是有限制的,可以读取图片的格式为:[BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
可是文件后缀是jpg格式,按道理说应该支持啊,后来将文件下载下来放到notepad++上查看才发现前缀是:RIFF? WEBPVP8 这说明该文件的实际格式是webp格式.文件后缀名有时候不是实际的文件格式.
最后解决方案
因为我的业务只支持特定格式的文件,在ImageIo支持读取的图片格式范围内,因此,当读取到null时,直接提示用户上传图片格式有误即可.
本地代码:
/**
* 支持转化为缩略图的文件
*/
private static final String[] SUPPORT_IMG_TYPE={"BMP", "bmp", "jpg", "JPG", "wbmp", "jpeg", "png", "PNG", "JPEG", "WBMP", "GIF", "gif"};
/**
自定义图片尺寸(缩略图)
*/
private byte[] reSizeImg(File showFile, String formatName){
ByteArrayOutputStream bos=null;
if(!checkImgType(formatName)){
throw new RuntimeException("不支持的图片格式!");
}
try{
bos=new ByteArrayOutputStream();
Image img= ImageIO.read(showFile);
BufferedImage bufferedImage=new BufferedImage(70,
70,BufferedImage.TYPE_INT_RGB);
Graphics g=bufferedImage.getGraphics();
g.drawImage(img,0,0,70,70,null);
ImageIO.write(bufferedImage,formatName,bos);
return bos.toByteArray();
}catch (IOException e){
throw new RuntimeException("图片读取异常");
}
}
/**
* 判断格式是否支持
* @param formatName
* @return
*/
private boolean checkImgType(String formatName){
for(int i=0;i<SUPPORT_IMG_TYPE.length;i++){
if(SUPPORT_IMG_TYPE[i].equals(formatName)){
return true;
}
}
return false;
}