背景:商城要做活动,要生成商户的活动二维码,现在有了活动的底图模板,商户上传自己的二维码就可以生成活动图。可以上传压缩包,也可以上传单个图。
转换工具类
public class ImageUtils {
private Logger logger = LoggerFactory.getLogger(ImageUtils.class);
private static Map<String, String> exitFile = new HashMap<>();
/**
* 处理 图片二维码,写入流
*
* @param file
* @param zos
* @throws Exception
*/
public void mergeImg(MultipartFile file, ZipOutputStream zos) throws Exception {
String name = file.getOriginalFilename();
String format = name.substring(name.lastIndexOf(".") + 1);
// 如果文件已存在就更改名字,不然putNextEntry 会报错
while (exitFile.containsKey(name)) {
String fileName = name.substring(0, name.lastIndexOf("."));
name = fileName + "-1." + format;
}
zos.putNextEntry(new ZipEntry(name));
exitFile.put(name, name);
InputStream temIs = this.getClass().getResourceAsStream("/template/template1.jpg");
BufferedImage code = ImageIO.read(file.getInputStream());
int width = code.getWidth();
int heigth = code.getHeight();
BufferedImage b = ImageIO.read(temIs);
Graphics2D g = b.createGraphics();
g.drawImage(code, 500, 1100, width, heigth, null);
g.dispose();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(b, format, os);
zos.write(os.toByteArray());
temIs.close();
}
/**
* 处理压缩包内的图片,写入流
*
* @param file
* @param zos
*/
public void mergeZip(MultipartFile file, ZipOutputStream zos) {
try {
File zip = FileUtils.transferToFile(file);
ZipFile zf = new ZipFile(zip, Charset.forName("GBK"));
Enumeration<? extends ZipEntry> iter = zf.entries();
while (iter.hasMoreElements()) {
ZipEntry entry = iter.nextElement();
String name = entry.getName();
String format = name.substring(name.lastIndexOf(".") + 1);
// 如果文件已存在就更改名字,不然putNextEntry 会报错
while (exitFile.containsKey(name)) {
String fileName = name.substring(0, name.lastIndexOf("."));
name = fileName + "-1." + format;
}
zos.putNextEntry(new ZipEntry(name));
exitFile.put(name, name);
InputStream ins = zf.getInputStream(entry);
BufferedImage codeBi = ImageIO.read(ins);
int cw = codeBi.getWidth();
int ch = codeBi.getHeight();
InputStream temIs = this.getClass().getResourceAsStream("/template/template1.jpg");
BufferedImage b = ImageIO.read(temIs);
Graphics2D g = b.createGraphics();
g.drawImage(codeBi, 500, 1100, cw, ch, null);
g.dispose();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(b, format, os);
zos.write(os.toByteArray());
os.close();
temIs.close();
ins.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void flushExitFileMap() {
exitFile.clear();
}
}
MultipartFile 转 FIle
public static File transferToFile(MultipartFile multipartFile) {
// 选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
File file = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
String[] filename = originalFilename.split("\\.");
file = File.createTempFile(filename[0], filename[1]);
multipartFile.transferTo(file);
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
service 调用
public void qrcode(MultipartFile[] files, HttpServletResponse response) {
try {
if (files != null && files.length > 0) {
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
ImageUtils utils = new ImageUtils();
utils.flushExitFileMap();
for (MultipartFile file : files) {
String name = file.getOriginalFilename();
String format = name.substring(name.lastIndexOf(".") + 1);
if ("jpg".equalsIgnoreCase(format) || "png".equalsIgnoreCase(format) || "jpeg".equalsIgnoreCase(format)) {
utils.mergeImg(file, zos);
} else if ("zip".equalsIgnoreCase(format)) {
utils.mergeZip(file, zos);
}
}
zos.closeEntry();
zos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
controller
@PostMapping(value = "/qrcode")
public void qrcode(@RequestParam("files") MultipartFile[] files, HttpServletResponse response) throws UnsupportedEncodingException {
String fileName = URLEncoder.encode("商户活动码牌.zip", "UTF-8");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
imageService.qrcode(files, response);
}