freemarker通过ftl生成模板并使用ZipOutputStream压缩直接下载

freemarker通过ftl生成模板并使用ZipOutputStream压缩直接下载

代码参考如下:

/**
 *<p>Title:SdkMockDeviceController.java</p>
 *<p>Description:数据模拟设备管理 Action</p>
 * @author ZGN
 * @date 2022/1/7 16:07
 */
@Service
public class SdkMockServiceImpl implements SdkMockService {
    private static final Logger log = LoggerFactory.getLogger(SdkMockServiceImpl.class);

    @Autowired
    private IDeviceApi iDeviceApi;

    @Autowired
    private IProductApi iProductApi;

    @Value("${iot.sdkTemplates.templates-path:C:\\Users\\changzheng\\Desktop\\test\\}")
    private String templatesPath;

    @Value("${emq.mqtt.ip:}")
    private String mqttIp;

    @Value("${emq.mqtt.port}")
    private String mqttPort;



    @Override
    public ResultMap<AResultCode, String> sdkMockdeviceDownload(HttpServletResponse response, String device_id) {
        ResultMap<AResultCode,String> result = new ResultMap<>();
        //判断设备id是否为空
        if (StringUtil.isNull(device_id)) {
            return result.setCode(AResultCode.MISS_ID);
        }
        //通过设备id查询设备三元组信息
        ResultMap<AResultCode, DeviceMockBean> DeviceMockBeanResultMap = iDeviceApi.getBasicInfoByMockDevice(device_id);
        if (AResultCode.isFailed(DeviceMockBeanResultMap)) {
            return result.setCode(DeviceMockBeanResultMap.getCode());
        }
        //获取该设备的三元组信息
        DeviceMockBean deviceMockBean = DeviceMockBeanResultMap.getResult();
        //如果设备三元组信息为null
        if (StringUtil.isNull(deviceMockBean)) {
            return result.setCode(AResultCode.IS_NULL);
        }
        //通过产品id获取该产品属性
        ResultMap<AResultCode, List<MockPropertyBean>> MockPropertyBeanResultMap = iProductApi.getPublishedDefaultBlockFunctionPropertyByProductKey(deviceMockBean.getProduct_key());
        if (AResultCode.isFailed(MockPropertyBeanResultMap)) {
            return result.setCode(MockPropertyBeanResultMap.getCode());
        }
        List<MockPropertyBean> MockPropertyBeanList = MockPropertyBeanResultMap.getResult();
        //存放所有属性
        SdkMockDeviceBean sdkMockDeviceBean = new SdkMockDeviceBean();
        //遍历所有属性
        List<String> propertyList = new ArrayList<String>();
        for(int i=0;i<MockPropertyBeanList.size();i++){
            String property_id = MockPropertyBeanList.get(i).getPid();
            propertyList.add(property_id);
        }
        //组装要生成的DeviceConf.json
        sdkMockDeviceBean.setDeviceName(deviceMockBean.getDevice_name());
        sdkMockDeviceBean.setDeviceSecret(deviceMockBean.getDevice_secret());
        sdkMockDeviceBean.setProductKey(deviceMockBean.getProduct_key());
        sdkMockDeviceBean.setPropertyList(propertyList);

        //新建模板生成工具
        FreemarkerUtil freemarkerUtil = new FreemarkerUtil();
        //新建生成的Template的map
        Map<String,Object> deviceConfMap = new HashMap<>();
        deviceConfMap.put("sdkMockDeviceBean",sdkMockDeviceBean);
        try {
            freemarkerUtil.generateFile(templatesPath,"DeviceConf.ftl",templatesPath+"talkweb_iot_mockDevice","DeviceConf.json",deviceConfMap);
        } catch (IOException e) {
            log.error("SdkMockServiceImpl类生成DeviceConf.json文件发生IOException");
            e.printStackTrace();
        } catch (TemplateException e) {
            log.error("SdkMockServiceImpl类生成DeviceConf.json文件发生TemplateException");
            e.printStackTrace();
        }

        //压缩并导出
        String zipName = "talkweb_iot_mockDevice.zip";
        File zipNameFile = new File(templatesPath+"talkweb_iot_mockDevice");
        try {
            response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(zipName, "utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        response.setContentType("application/octet-stream;charset=UTF-8");
        OutputStream outputStream = null;
        ZipOutputStream zipOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            outputStream = response.getOutputStream();
            //压缩输出流
            zipOutputStream = new ZipOutputStream(outputStream);
            //加快缓存流速度
            bufferedOutputStream = new BufferedOutputStream(zipOutputStream);
            //递归压缩,实现文件夹和文件都以压缩
            zip(zipOutputStream,zipNameFile,zipNameFile.getName(),bufferedOutputStream);

        } catch (IOException e) {
            log.error("SdkMockServiceImpl类生成文件输入输出流发生IOException");
            e.printStackTrace();
        }finally {
            try {
                //关闭输出流
                bufferedOutputStream.close();
                //关闭zip输出流
                zipOutputStream.close();
            } catch (IOException e) {
                log.error("SdkMockServiceImpl类关闭文件输入输出流发生IOException");
                e.printStackTrace();
            }
        }

        result.setCode(AResultCode.OK);
        return result;
    }

    //进行zip压缩
    private void zip(ZipOutputStream zipOutputStream,File targetFile,String targetName,BufferedOutputStream bufferedOutputStream){
        FileInputStream fileInputStream = null;
        BufferedInputStream bufferedInputStream = null;
        if(targetFile.isDirectory()){
            //获取到所有文件
            File[] files = targetFile.listFiles();
            //如果文件为空
            if(files.length == 0){
                try {
                    zipOutputStream.putNextEntry(new ZipEntry(targetName+"/"));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //遍历文件列表,实现递归压缩
            for (File file : files){
                zip(zipOutputStream,file, targetName+"/"+file.getName(),bufferedOutputStream);
            }
        }else{
            try {
                //创建压缩条目
                zipOutputStream.putNextEntry(new ZipEntry(targetName));
                //读取文件
                fileInputStream = new FileInputStream(targetFile);
                //读取到缓冲流
                bufferedInputStream = new BufferedInputStream(fileInputStream);
                byte[] bytes = new byte[1024];
                int length = -1;
                while((length = bufferedInputStream.read(bytes))!=-1){
                    bufferedOutputStream.write(bytes,0,length);
                }
            } catch (IOException e) {
                log.error("SdkMockServiceImpl类zip压缩方法生成文件输入输出流发生IOException");
                e.printStackTrace();
            }
        }
        try {
            //关闭输出流
            bufferedOutputStream.flush();
            if(bufferedInputStream!=null){
                bufferedInputStream.close();
            }
        } catch (IOException e) {
            log.error("SdkMockServiceImpl类zip压缩方法关闭文件输入输出流发生IOException");
            e.printStackTrace();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于Spring Boot使用Freemarker模板生成Word文档并加密的例子,可以按照以下步骤进行操作: 1. 首先,您需要在pom.xml文件中添加Freemarker和Apache POI的依赖项。在 `<dependencies>` 标签内添加以下代码: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建一个Freemarker模板文件,例如 `template.ftl`,并在其中编写Word文档的内容,可以使用Freemarker语法进行动态内容替换。 3. 创建一个Controller类,并添加以下代码: ```java import freemarker.template.Configuration; import freemarker.template.Template; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFEncryptor; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; @Controller public class WordController { @Autowired private Configuration freemarkerConfiguration; @GetMapping("/generate-word") public void generateWord(HttpServletResponse response) throws Exception { // 加载Freemarker模板 Template template = freemarkerConfiguration.getTemplate("template.ftl"); // 创建Word文档对象 XWPFDocument document = new XWPFDocument(); // 创建段落对象 XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); // 填充模板内容 Map<String, Object> data = new HashMap<>(); // 添加模板中需要的数据,可以根据实际需求自行修改 // 渲染模板 run.setText(templateToString(template, data)); // 加密Word文档 XWPFEncryptor encryptor = new XWPFEncryptor(document); encryptor.encrypt("password"); // 替换为您自己的密码 // 设置响应头 response.setHeader("Content-disposition", "attachment; filename=encrypted_word.docx"); response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); // 导出Word文档 OutputStream outputStream = response.getOutputStream(); document.write(outputStream); outputStream.close(); } private String templateToString(Template template, Map<String, Object> data) throws Exception { StringWriter stringWriter = new StringWriter(); template.process(data, stringWriter); return stringWriter.toString(); } } ``` 4. 在Spring Boot的配置文件(例如 `application.properties`)中添加以下配置: ```properties spring.freemarker.template-loader-path=classpath:/templates/ ``` 5. 运行Spring Boot应用程序,并访问 `/generate-word` 路径,即可生成下载加密的Word文档。 请注意,上述代码仅为示例,您可以根据实际需求进行修改和扩展。同时,为了确保文档的安全性,请根据您的需求修改加密密码和文件名。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值