Java Web 获取文件,后端判断文件是否为图片,并压缩图片
1、在配置文件中设置图片白名单。百度可得,图片类型很多很多,一个一个set进去查询又不好看,就设置个白名单,到时候遍历就是。
1
2>#照片白名单
photoType=bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp,avif,apng
2、使用 Thumbnailator 压缩图片,首先导入pom包
1
2
3
4
5
6
<!--压缩图片-->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
然后就是实际代码编写了,这里我是先判断照片类型,再压缩文件,这里Thumbnails的具体用法可以看看官网,或者百度以下,我这里使用的是 .size(2000, 1500) 来固定照片长宽高,达到每个照片都是290kb左右,而使用另一种方法没法固定照片大小,如果照片太大,压缩之后就会超过300kb,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//判断照片类型
Set<String> typeSet = new HashSet<>();
String photoTypes = photoType.toString();//获取照片名单的内容
String[] split = photoTypes.split(",");
for (String str : split) {
typeSet.add("."+str);
}
String fileIndexName = file.getOriginalFilename();
int index = fileIndexName.lastIndexOf(".");
String fileType = fileIndexName.substring(index);
if (typeSet.contains(fileType)) {
// 获取文件名
String fileName1 = file.getOriginalFilename();
// 获取文件后缀
String prefix = fileName1.substring(fileName1.lastIndexOf("."));
// 用uuid作为文件名,防止生成的临时文件重复
final File excelFile = File.createTempFile(String.valueOf(UUID.randomUUID()), prefix);
// MultipartFile to File
file.transferTo(excelFile);
if (file.getSize() >= 1024 * 300) {//设置照片大小不超过300kb,超过就压缩
Thumbnails.of(excelFile)
.size(2000, 1500)
.keepAspectRatio(false)
.allowOverwrite(true)
.toFile(excelFile);
}
fileName = UUID.randomUUID() + "." + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
fileSystemService.uploadFile("/file/" + getFilePath() + "/" + fileName, createMultipartFile(excelFile));//file toMultipartFile
其中使用到了几个转换类
1、File 转 MultipartFile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* File 转 MultipartFile
*
* @param file
* @return
*/
private MultipartFile createMultipartFile(File file) {
try {
FileItem fileItem = null;
MultipartFile multipartFile = null;
fileItem = new DiskFileItem(file.getName(), Files.probeContentType(file.toPath()),
false, file.getName(), (int) file.length(), file.getParentFile());
InputStream input = new FileInputStream(file);
OutputStream os = fileItem.getOutputStream();
IOUtils.copy(input, os);
multipartFile = new CommonsMultipartFile(fileItem);
os.close();
input.close();
return multipartFile;
} catch (Exception e) {
e.getStackTrace();
throw new RuntimeException("File转MultipartFile失败");
}
}2、获取年月日目录结构
1
2
3
4
5
6
7
8
9
/**
* 获取年/月/日目录结构
*
* @return String
*/
public String getFilePath() {
String path = DateUtils.getDay();
return "/" + path.replaceAll("-", "");
}
Java Web 获取文件,后端判断文件是否为图片,并压缩图片
https://tdsgpo.top/2022/04/02/Java Web 获取文件,后端判断文件是否为图片,并压缩图片/