因为个人原因,不在csdn上更新了,欢迎各位来到我的个人博客:
https://tdsgpo.top
在实际开发中,甲方爸爸会提出各种要求,就比如啥上传文件没限制,上传图片却要限制大小,就搞不懂,但没得办法,谁叫他们是甲方呢。
1、在配置文件中设置图片白名单。百度可得,图片类型很多很多,一个一个set进去查询又不好看,就设置个白名单,到时候遍历就是。
#照片白名单 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包
<!--压缩图片--> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency>
然后就是实际代码编写了,这里我是先判断照片类型,再压缩文件,这里Thumbnails的具体用法可以看看官网,或者百度以下,我这里使用的是 .size(2000, 1500) 来固定照片长宽高,达到每个照片都是290kb左右,而使用另一种方法没法固定照片大小,如果照片太大,压缩之后就会超过300kb,
//判断照片类型 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
/** * 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、获取年月日目录结构
/** * 获取年/月/日目录结构 * * @return String */ public String getFilePath() { String path = DateUtils.getDay(); return "/" + path.replaceAll("-", ""); }
欢迎大家光临我的个人博客,里面还有更多的好东西