/* http-cm - File management extensions to jdk.httpserver Copyright (C) 2021 Ulrich Hilger This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.httpserver.cm.actor; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; /** * Eine Klasse mit Methoden zum entpacken von Dateien * * @author Ulrich Hilger, 15. Januar 2024 */ public class Unzipper { /* --------- ZIP entpacken ---------------- */ public String extractZipfile(String fName, String relPath, String base) { //logger.fine("fName: " + fName + ", relPath: " + relPath); String result = null; if (!relPath.startsWith(".")) { try { //File targetDir = new File(fileBase, relPath); //File targetDir = getTargetDir(relPath); File archive = new File(base, fName); if(extract(archive)) { result = "ok"; } else { result = "error while extracting"; } } catch(Exception ex) { result = ex.getLocalizedMessage(); //logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); } } else { result = "Falsche relative Pfadangabe."; } return result; } /** * extract a given ZIP archive to the folder respective archive resides in * @param archive the archive to extract * @throws Exception */ private boolean extract(File archive) throws Exception { ZipFile zipfile = new ZipFile(archive); Enumeration en = zipfile.entries(); while(en.hasMoreElements()) { ZipEntry zipentry = (ZipEntry) en.nextElement(); unzip(zipfile, zipentry, archive.getParent()); } zipfile.close(); return true; } /** * unzip a given entry of a given zip file to a given location * @param zipfile the zip file to read an entry from * @param zipentry the zip entry to read * @param destPath the path to the destination location for the extracted content * @throws IOException */ private void unzip(ZipFile zipfile, ZipEntry zipentry, String destPath) throws IOException { byte buf[] = new byte[1024]; InputStream is = zipfile.getInputStream(zipentry); String outFileName = destPath + File.separator + zipentry.getName(); File file = new File(outFileName); if(!zipentry.isDirectory()) { file.getParentFile().mkdirs(); if(!file.exists()) file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); int i = is.read(buf, 0, 1024); while(i > -1) { fos.write(buf, 0, i); i = is.read(buf, 0, 1024); } fos.close(); is.close(); } else { file.mkdirs(); } } }