Java Web 获取文件,后端判断文件是否为图片,并压缩图片

在实际开发中,甲方爸爸会提出各种要求,就比如啥上传文件没限制,上传图片却要限制大小,就搞不懂,但没得办法,谁叫他们是甲方呢。

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("-", "");
    }

猜你喜欢

转载自blog.csdn.net/a1099380657/article/details/121094399