栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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包

        
        
            net.coobird
            thumbnailator
            0.4.8
        

然后就是实际代码编写了,这里我是先判断照片类型,再压缩文件,这里Thumbnails的具体用法可以看看官网,或者百度以下,我这里使用的是 .size(2000, 1500) 来固定照片长宽高,达到每个照片都是290kb左右,而使用另一种方法没法固定照片大小,如果照片太大,压缩之后就会超过300kb,

//判断照片类型
Set 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

    
    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、获取年月日目录结构

    
    public String getFilePath() {
        String path = DateUtils.getDay();
        return "/" + path.replaceAll("-", "");
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397059.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号