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);
}
}
}