根据图片url获取图片压缩后转换为base64编码

POM文件添加:

  <!-- 图片压缩 -->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.9</version>
        </dependency>

代码块:

  /**
     * 根据图片url获取图片并转换为base64编码
     *
     * @param srcUrl 图片地址
     * @param srcUrl 图片大小 KB
     * @return 图片base64编码
     */
    public static String pictureUrlToBase64(String srcUrl, int size) {
        ByteArrayOutputStream outPut = new ByteArrayOutputStream();
        byte[] data = new byte[1024 * 8];
        File file = null;
        File originalFile = null;
        InputStream inputStream = null;
        String encode = null;
        try {
            // 创建URL
            URL url = new URL(srcUrl);
            String suffix = srcUrl.substring(srcUrl.lastIndexOf("."));

            file = new File(TEMP_PATH + newFileName(suffix));
            FileUtils.copyURLToFile(url, file);
            if (file.length() > size * 1024) {
                //压缩图片
                originalFile = new File(TEMP_PATH + newFileName(suffix));
                compress(originalFile, file, size);
                inputStream = new FileInputStream(originalFile);
                int len = -1;
                while (-1 != (len = inputStream.read(data))) {
                    outPut.write(data, 0, len);
                }
            }
            // 对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            encode = encoder.encode(outPut.toByteArray());
        } catch (Exception e) {
            Asserts.fail("图片压缩失败:" + e.getMessage());
        } finally {
            IOUtils.closeQuietly(inputStream);
        }
        return encode;
    }

    /**
     * 生成图片文件名称
     *
     * @param suffix 图片后缀名
     * @return 图片名称
     */
    private static String newFileName(String suffix) {
        String fileName = UUID.randomUUID().toString().replaceAll("-", "");
        if (!StrUtil.isEmpty(suffix)) {
            fileName += StrUtil.DOT + suffix;
        }
        return fileName;
    }

    /**
     * 压缩图片
     *
     * @param originalFile 压缩后的图片
     * @param file         压缩前的图片
     * @param size         图片大小
     * @throws IOException
     */
    private static void compress(File originalFile, File file, int size) throws IOException {
        BufferedImage img = ImageIO.read(file);
        // 根据原图与要求的缩略图比例,找到最合适的缩略图比例
        int width = img.getWidth();
        int height = img.getHeight();
        // 图片缩略图实现,强制按照指定的宽高进行缩略keepAspectRatio(false)
        if (null != originalFile && !originalFile.exists()) {
            originalFile.createNewFile();
        }
        int desWidth = new BigDecimal(width).multiply(
                new BigDecimal(0.25f)).intValue();
        int desHeight = new BigDecimal(height).multiply(
                new BigDecimal(0.25f)).intValue();
        Thumbnails.of(file).size(desWidth, desHeight).outputQuality(0.5f).toFile(originalFile);
        if (originalFile.length() > size * 1024) {
            compress(originalFile, originalFile, size);
        }
    }

在本地存储的临时图片文件根据情况看是否删除,我是用定时器做的删除处理(在当前方法删除如果流没有关闭是无法彻底删除的)。

定时器代码:

package com.ltd.cloud.mmt.task;

import cn.hutool.core.date.DateTime;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;

/**
 * 图片处理定时器:每天凌晨1点执行
 */
@Component
@Slf4j
public class PicFileTask {

    private static final long THIRTY_MINUTE = 30 * 60 * 1000;
    private final static String TEMP_PATH = "/temp/upload/pic/";

    // @Scheduled(cron = "30 * * * * ?")
    @Scheduled(cron = "0 0 1 * * ?")
    public void deleteUploadTempFile() {
        log.info("FileTask#deleteUploadTempFile start...");
        File[] files = new File(TEMP_PATH).listFiles();
        try {
            if (null != files && files.length > 0) {
                for (File file : files) {
                    Path path = Paths.get(file.getPath());
                    BasicFileAttributeView basicview = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
                    BasicFileAttributes attr = basicview.readAttributes();
                    long time = attr.creationTime().toMillis();
                    // 删除30分钟前的图片文件
                    if (DateTime.now().getTime() - time > THIRTY_MINUTE && (null != file && file.exists())) {
                        file.delete();
                    }
                }
            }
        } catch (Exception e) {
            log.error("deleteUploadTempFile error", e);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值