主要是为了解决图片文件zip解压并转base64,图片以base64编码保存,不以文件形式保存至服务器的场景。
1、文件解析后对象
/**
* 文件解析对象
*/
@Data
public class UnzipFileVo {
/**
* 文件类型:(0:文件夹;1:图片)
*/
private Integer type;
/**
* 文件路径(如:src/main/java/com/zyq/entity/User.java)
*/
private String path;
/**
* 图片名称
*/
private String name;
/**
* 图片base64
*/
private String imgBase64;
}
2、解压文件工具类
/**
* 解析文件工具类
*/
public class UnzipUtils {
/**
* 本地文件解压
*
* @param file 压缩后的zip图片文件
* @return 解压后的图片信息列表
*/
public static List<UnzipFileVo> unzip(File file) {
if (Objects.isNull(file) || !file.exists()) {
return Collections.emptyList();
}
ZipFile zip = null;
try {
zip = new ZipFile(file);
} catch (IOException e) {
e.printStackTrace();
}
if (Objects.isNull(zip)) {
return Collections.emptyList();
}
Enumeration<? extends ZipEntry> entries = zip.entries();
List<UnzipFileVo> vos = new ArrayList<>();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
String path = entry.getName();
UnzipFileVo vo = new UnzipFileVo();
vo.setPath(path);
// 解析文件夹
boolean directory = entry.isDirectory();
if (directory) {
//为空的文件夹,不做处理
continue;
}
byte[] bytes = null;
try {
InputStream in = zip.getInputStream(entry);
bytes = read(in); //解决图片显示不全问题
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
String base64Str = encoder.encode(bytes); //bytes转base64
String name = path.substring(path.lastIndexOf("/") + 1).split("\\.")[0];
vo.setType(1);
vo.setName(name);
vo.setImgBase64("data:image/png;base64," + base64Str);
vos.add(vo);
}
if (Objects.nonNull(zip)) {
try {
zip.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return vos;
}
/**
* 处理图片显示不全问题
*
* @param inputStream 上传文件流
* @return 字节
*/
public static byte[] read(InputStream inputStream) throws IOException {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int num = inputStream.read(buffer);
while (num != -1) {
baos.write(buffer, 0, num);
num = inputStream.read(buffer);
}
baos.flush();
return baos.toByteArray();
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
/**
* 上传文件解压
*
* @param multipartFile 上传文件
* @return 解压后的文件列表
*/
public static List<UnzipFileVo> unzip(MultipartFile multipartFile) {
File file = MultipartFileToFileUtil.transferToFile(multipartFile);
if (Objects.isNull(file)) {
return Collections.emptyList();
}
List<UnzipFileVo> vos = unzip(file);
if (file.exists()) {
file.delete();
}
return vos;
}
}
public class MultipartFileToFileUtil {
/**
* MultipartFile 转 File
*
* @param multipartFile
* @throws Exception
*/
public static File transferToFile(MultipartFile multipartFile) {
//选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
File file = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
//获取文件后缀
String prefix = originalFilename.substring(originalFilename.lastIndexOf("."));
file = File.createTempFile(originalFilename, prefix);
multipartFile.transferTo(file);
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
}