方式一:MultipartFile转File再获取
MultipartFile multipartFile = uploadReq.getFile(); // 获取请求传过来的MultipartFile
String fileName = multipartFile.getOriginalFilename();
String prefix=fileName.substring(fileName.lastIndexOf("."));
try {
File file = File.createTempFile(prefix, String.valueOf(System.currentTimeMillis())); // 创建临时文件
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
BufferedImage bufferedImage =ImageIO.read(file); // 通过临时文件获取图片流
if (bufferedImage == null) {
// 证明上传的文件不是图片,获取图片流失败,不进行下面的操作
attachmentInfo.setWidth(0);
attachmentInfo.setHeight(0);
return;
}
attachmentInfo.setWidth(bufferedImage.getWidth());
attachmentInfo.setHeight(bufferedImage.getHeight());
// 省略逻辑判断
} catch (Exception e) {
// 省略异常操作
}
方式二:MultipartFile直接获取
通过源码可以看到ImageIO.read()除了通过File获取BufferedImage之外,也提供了通过InputStream来获取BufferedImage的方法,而MultipartFile本身也可以获取到InputStream。
于是有如下方法获取到文件的宽高:
private void imageProperty(MultipartFile multipartFile, RcAttachmentInfo attachmentInfo) {
try {
BufferedImage bufferedImage = ImageIO.read(multipartFile.getInputStream()); // 通过MultipartFile得到InputStream,从而得到BufferedImage
if (null == bufferedImage) {
// 证明上传的文件不是图片,获取图片流失败,不进行下面的操作
attachmentInfo.setWidth(0);
attachmentInfo.setHeight(0);
return;
}
attachmentInfo.setWidth(bufferedImage.getWidth());
attachmentInfo.setHeight(bufferedImage.getHeight());
}catch (Exception e){
log.warn("上传图片获取流异常",e.getMessage());
e.printStackTrace();
}
}
注:json获取到InputStream并被消费之后貌似会出现流不能再次使用的情况,导致数据无法存储。但是此处MultipartFile获取到流并消费(即通过这个流获取到了宽高)后,MultipartFile能够被正常存储(已测试)。