create and download password protected zipfile

below java step can be used to download password protected zipfile.
zip4j library is required.(GitHub - srikanth-lingala/zip4j: A Java library for zip files and streams)

//list of files to be compressed in a zip file
ClipboardProperty SendFiles = tools.getPrimaryPage().getProperty("SendFiles");
boolean encrypt = Boolean.valueOf(tools.getParameterPage().getString("encrypt"));

try{
    java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();

    //Zip4j--begin Setting password for the ZIP file 
    net.lingala.zip4j.io.outputstream.ZipOutputStream zos;
    if(encrypt){
        String password = tools.getParameterPage().getString("password"); //AES only supports key sizes of 16, 24 or 32 bytes.
        zos= new net.lingala.zip4j.io.outputstream.ZipOutputStream(baos,password.toCharArray());
    }else{
        zos= new net.lingala.zip4j.io.outputstream.ZipOutputStream(baos);
    }
    net.lingala.zip4j.model.ZipParameters zipParameters = new net.lingala.zip4j.model.ZipParameters();
    zipParameters.setCompressionMethod(net.lingala.zip4j.model.enums.CompressionMethod.DEFLATE);
    if(encrypt){
        zipParameters.setEncryptFiles(true);
        zipParameters.setEncryptionMethod(net.lingala.zip4j.model.enums.EncryptionMethod.ZIP_STANDARD);
        //7zip is ok with AES, however, windows 11 default decompression feature doesn't work if using AES.
        //zipParameters.setEncryptionMethod(net.lingala.zip4j.model.enums.EncryptionMethod.AES);
        //zipParameters.setAesKeyStrength(net.lingala.zip4j.model.enums.AesKeyStrength.KEY_STRENGTH_128);
    }
    //Zip4j--end
    //read files
    for (Iterator it = SendFiles.iterator(); it.hasNext();) {
        ClipboardProperty objOneRow = (ClipboardProperty) it.next();
        ClipboardPage objFile = objOneRow.getPageValue();

        byte [] zipEntryFileData = Base64Util.decodeToByteArray(objFile.getProperty("AttachStream").getStringValue());  
        String zipEntryFileName = objFile.getProperty("AttachName").getStringValue();
        //add to zip file
        zipParameters.setFileNameInZip(zipEntryFileName);
        zos.putNextEntry(zipParameters);

        java.io.ByteArrayInputStream bais = new java.io.ByteArrayInputStream(zipEntryFileData);
        byte[] buffer = new byte[4096];
        int length;
        while ((length = bais.read(buffer)) > 0) {
            zos.write(buffer, 0, length);
        }
        zos.closeEntry();
        bais.close();
    }
    zos.close();
    byte[] zipData = baos.toByteArray();
    baos.close();
    //CJK filename encoding
    String urlEncodedFileName = java.net.URLEncoder.encode(downloadFileName, "UTF-8")+".zip";
    urlEncodedFileName = "\"" + urlEncodedFileName + "\"" + ";filename*=UTF-8''" + urlEncodedFileName; 
    //Send file to client
    HashStringMap headers = new HashStringMap();
    headers.put("ContentDisposition", "attachment; filename="+urlEncodedFileName);
    headers.put("ContentType", "application/zip");
    downloadFileName += ".zip";
    tools.sendFile(zipData,downloadFileName,false,headers,true);
} catch (java.lang.Exception e) {
    downloadFileName = "";
    e.printStackTrace();
    throw new java.lang.RuntimeException(e);
}

Hi @Chunzhi_Hong,

I have the same requirement i need to password protect the zip file when user download the file it should be password protected . The above code is working fine ?