package de.uhilger.httpserver.cm; 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; /** * * @author ulli */ 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(); } } }