springboot 实现图片合并

背景:商城要做活动,要生成商户的活动二维码,现在有了活动的底图模板,商户上传自己的二维码就可以生成活动图。可以上传压缩包,也可以上传单个图。

转换工具类

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot实现图片上传持久化可以通过以下步骤来实现: 1. 配置文件上传解析器:为了能够解析客户端上传的文件,我们需要配置一个专门用于解析文件的解析器。可以通过在SpringBoot的配置类中添加`MultipartResolver`的Bean来实现,或者使用注解`@Bean`定义`CommonsMultipartResolver`。 2. 创建Controller处理文件上传请求:在Controller中添加一个处理文件上传请求的方法,使用`@PostMapping`注解来定义该方法是处理POST请求的。在方法中使用`@RequestParam("file")`注解来获取客户端上传的文件,并使用`MultipartFile`类型来接收文件数据。 3. 定义文件存储路径:为了将上传的文件持久化保存,我们需要定义一个文件存储路径。可以通过在配置文件中定义一个属性,然后在Controller中使用`@Value`注解来获取该属性的值。 4. 将文件保存到指定路径:在文件上传请求处理方法中,通过调用`MultipartFile`对象的`transferTo()`方法,将文件保存到指定的路径下。 5. 返回文件访问路径:为了能够在客户端访问到上传的文件,我们需要将文件的访问路径返回给客户端。可以通过在Controller中添加一个方法,将文件的相对路径转换为绝对路径,并将该路径返回给客户端。 总结起来,实现图片上传持久化的步骤包括配置文件上传解析器、创建Controller处理文件上传请求、定义文件存储路径、将文件保存到指定路径、返回文件访问路径。这样就能够实现SpringBoot图片上传并持久化保存了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [springboot实现简单的注册登录功能](https://blog.csdn.net/m0_67402731/article/details/125243930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [CKEditor 5 + SpringBoot实战(四):SpringBoot 实现文件上传](https://blog.csdn.net/ramostear/article/details/107189599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值