Controller实现zip文件下载

public void download(String tableName) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(byteArrayOutputStream);

        Map<String, String> map = generatorDomain.outputString(tableName);
        map.forEach((k, v) -> {
            try {
                zip.putNextEntry(new ZipEntry(k));

                IoUtil.writeUtf8(zip, false, v);

                // 刷新缓冲区,一般写字符时用到,因为写字符时先进入缓冲区,然后将内存中的数据立刻写出(因为缓冲区是写满之后才会写出, 用flush()就不必等到缓冲区满,立刻写出)流对象还可以继续使用.
                zip.flush();
                // 关闭当前 ZIP 条目并定位流以写入下一个条目
                zip.closeEntry();
            } catch (IOException e) {
                log.error("{} 表名,渲染模板失败" , tableName, e);
            }
        });

        byte[] bytes = byteArrayOutputStream.toByteArray();

        HttpServletResponse response = RequestContextHolderUtils.getResponse();
        response.reset();
        response.setContentType("application/octet-stream;charset=UTF-8");
        response.setHeader("Content-Disposition" , "attachment; filename='" + tableName + ".zip'");
        response.addHeader("Content-Length" , "" + bytes.length);

        try (ServletOutputStream out = response.getOutputStream()) {
            IoUtil.write(out, true, bytes);
        } catch (IOException e) {
            log.error("{} 文件下载失败" , tableName, e);
        }

    }


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐