今日份鸡汤:我深知自己不够优秀,当遇到像太阳一样的人,我追赶不上,但是可以学着他们奔跑的样子,也往前走上几步,哪怕最后失去踪影,起码也曾被阳光沐浴过,往后,就照着光的样子生活~
需求场景:
前几天做了一个上传图片的接口,今天说让加一下尺寸和大小的限制,废话不多说,直接上代码吧:
我们前端是通过MultipartFile对象(该对象里面是图片)进行文件上传的。
public class Test {
public static void main(String[] args) throws Exception {
// 文件对象
MultipartFile file = 假设此处是前端传过来的对象;
// 文件大小;其中file.length()获取的是字节,除以1024可以得到以kb为单位的文件大小
long size = file.getSize() / 1024;
// 图片对象
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
// 宽度
int width = bufferedImage.getWidth();
// 高度
int height = bufferedImage.getHeight();
// 打印信息
System.out.printf("图片大小:%skb;图片宽度:%s像素;图片高度:%s像素", size, width, height);
执行结果:
图片大小:4424kb;图片宽度:7360像素;图片高度:4912像素
如果使用File对象(该对象里面是图片),代码如下:
public class Test {
public static void main(String[] args) throws Exception {
// 文件对象
File file = new File("C:\\test\\20220619\\city.jpg");
// 文件大小;其中file.length()获取的是字节,除以1024可以得到以kb为单位的文件大小
long size = file.length() / 1024;
// 图片对象
BufferedImage bufferedImage = ImageIO.read(new FileInputStream(file));
// 宽度
int width = bufferedImage.getWidth();
// 高度
int height = bufferedImage.getHeight();
// 打印信息
System.out.printf("图片大小:%skb;图片宽度:%s像素;图片高度:%s像素", size, width, height);
执行结果:
图片大小:4424kb;图片宽度:7360像素;图片高度:4912像素
这块附上一个,postman测试文件上传的方法:https://www.jianshu.com/p/fe60e766d54a
虽然功能实现了,但是也不免遇到坑,我在本地测试的时候完全没有问题,但是部署到测试环境,其他同事就来反馈,图片不能上传,额。。。。
然后我就想着要不换个图片,果然换个图片空指针就出来了。debug发现bufferedImage = null。
简单描述就是有的图片格式正确,有的图片格式为WEBP,WEBP格式的就会出现null情况。
这块再简单说明一下ImageIO用法:
它可读取的图片类型是有限制的,可以读取图片的格式为:[BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
但是你可能要说你的图片文件后缀是png格式,按道理说应该支持啊,后来将文件下载下来放到notepad++上查看才发现前缀是:RIFF?� WEBPVP8 这说明该文件的实际格式是webp格式。文件后缀名有时候不是实际的文件格式。
这段代码输出支持的图片处理格式
String readFormats[] = ImageIO.getReaderFormatNames();
String writeFormats[] = ImageIO.getWriterFormatNames();
System.out.println("Readers: " + Arrays.asList(readFormats));