From af99308ac8192fd47be8f6ec030f973a0bf23072 Mon Sep 17 00:00:00 2001
From: ulrich <undisclosed>
Date: Tue, 03 Apr 2018 08:35:13 +0000
Subject: [PATCH] Packen von Ordnern hergestellt

---
 src/java/de/uhilger/filecms/api/FileMgr.java |  131 ++++++++++++++++++++++++++++++++++---------
 1 files changed, 102 insertions(+), 29 deletions(-)

diff --git a/src/java/de/uhilger/filecms/api/FileMgr.java b/src/java/de/uhilger/filecms/api/FileMgr.java
index fba0d22..32c3a54 100644
--- a/src/java/de/uhilger/filecms/api/FileMgr.java
+++ b/src/java/de/uhilger/filecms/api/FileMgr.java
@@ -23,6 +23,7 @@
 import de.uhilger.filecms.pub.FileNameComparator;
 import de.uhilger.wbx.Bild;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
@@ -38,8 +39,11 @@
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.zip.Adler32;
+import java.util.zip.CheckedOutputStream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
 import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.io.FileUtils;
 
@@ -90,7 +94,7 @@
   private List<FileRef> listInt(String relPath, String orderBy, String order) {
     Bild bild = new Bild();
     List<FileRef> files = new ArrayList();
-    if (!relPath.startsWith(".")) {
+    if (!relPath.startsWith(".") && !relPath.contains("WEB-INF") && !relPath.contains("META-INF")) {
       if (relPath.length() == 0) {
         FileRef namedPublicFolder = new FileRef(PUB_DIR_NAME, true);
         logger.finer(namedPublicFolder.getAbsolutePath());
@@ -126,9 +130,13 @@
               fname = fname.substring(0, fname.length() - 1);
             }
             logger.fine(fname);
-            FileRef ref = new FileRef(fname, fileArray[i].isDirectory());
-            ref.setMimetype(bild.getMimeType(fileArray[i]));
-            files.add(ref);
+            if(!fname.contains("WEB-INF") && !fname.contains("META-INF")) {
+              long fLen = fileArray[i].length();
+              long lastMod = fileArray[i].lastModified();
+              FileRef ref = new FileRef(fname, fileArray[i].isDirectory(), fileArray[i].isHidden(), lastMod, fLen);
+              ref.setMimetype(bild.getMimeType(fileArray[i]));
+              files.add(ref);
+            }
           }
         }
       }
@@ -395,36 +403,12 @@
           Thumbnails.of(original)
                   .size(bild.getVariantenGroesse(i), bild.getVariantenGroesse(i))
                   .keepAspectRatio(true)
+                  .outputQuality(0.7)
                   .toFile(newImgFile);
         } catch (IOException ex) {
           logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
         }
       }
-      /*
-      Image image = Toolkit.getDefaultToolkit().getImage(original.getAbsolutePath());
-      MediaTracker mediaTracker = new MediaTracker(new Container());
-      mediaTracker.addImage(image, 0);
-      try {
-        mediaTracker.waitForID(0);
-
-        if (!mediaTracker.isErrorAny()) {
-          for (int i = 0; i < Bild.GR.length; i++) {
-            StringBuffer buf = new StringBuffer();
-            buf.append(nurname);
-            buf.append(bild.getVariantenName(i));
-            buf.append(ext);
-            File newImgFile = new File(dir, buf.toString());
-            if (!newImgFile.exists()) {
-              logger.fine(original.getAbsolutePath() + " " + newImgFile.getAbsolutePath());
-              bild.writeImageFile(image, bild.getVariantenGroesse(i), bild.getMimeType(original), newImgFile.getAbsolutePath());
-              //bild.writeImageFile(image, photo.getVariantenGroesse(i), photo.getMimetype(), photo.getAbsolutePath(basisPfad), photo.getVariantenName(basisPfad, i));
-            }
-          }
-        }
-      } catch (IOException | InterruptedException ex) {
-        logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
-      }
-      */
       return "ok";
     } else {
       return "Pfad micht erlaubt.";
@@ -467,6 +451,9 @@
       return "Pfad micht erlaubt.";
     }
   }
+  
+  /* --------- ZIP entpacken ---------------- */
+  
   public String extractZipfile(String relPath, String filename) {
     String result = null;
     if (!relPath.startsWith(".")) {    
@@ -531,6 +518,92 @@
 		}
 	}
 
+  /* ------------- Ornder als ZIP packen --------------- */
+  
+  public String packFolder(String relPath) {
+    if (!relPath.startsWith(".")) {    
+      try {
+        File targetDir = getTargetDir(relPath);
+        File parentDir = targetDir.getParentFile();
+        StringBuffer fname = new StringBuffer();
+        fname.append(targetDir.getName());
+        fname.append(".zip");
+        File archiveFile = new File(parentDir, fname.toString());
+        FileRef folderToPack = new FileRef(targetDir.getAbsolutePath());
+        FileRef archive = new FileRef(archiveFile.getAbsolutePath());
+        pack(folderToPack, archive);
+        return "ok";
+      } catch(Exception ex) {
+        String result = ex.getLocalizedMessage();
+        logger.log(Level.SEVERE, result, ex);
+        return result;
+      }
+    } else {
+      return "Falsche relative Pfadangabe";
+    }
+  }
+  
+	/**
+	 * pack the contents of a given folder into a new ZIP compressed archive
+	 * @param folder  the folder to pack
+	 * @param archive  the archive to create from the given files
+	 * @throws Exception
+	 */
+	private boolean pack(FileRef folder, FileRef archive) throws Exception {
+		File file = new File(archive.getAbsolutePath());
+		FileOutputStream fos = new FileOutputStream(file);
+		CheckedOutputStream checksum = new CheckedOutputStream(fos, new Adler32());
+		ZipOutputStream zos = new ZipOutputStream(checksum);
+		pack(zos, folder.getAbsolutePath(), "");
+		zos.flush();
+		zos.finish();
+		zos.close();
+		fos.flush();
+		fos.close();
+		return true;
+	}
+
+	/**
+	 * go through the given file structure recursively
+	 * @param zipFile  the ZIP file to write to
+	 * @param srcDir  the directory to pack during this cycle
+	 * @param subDir  the subdirectory to append to names of file entries inside the archive
+	 * @throws IOException
+	 */
+	private void pack(ZipOutputStream zipFile, String srcDir, String subDir) throws IOException {
+		File[] files = new File(srcDir).listFiles();
+		for(int i = 0; i < files.length; i++) {
+			if(files[i].isDirectory()) {
+				pack(zipFile, files[i].getAbsolutePath(), subDir + File.separator + files[i].getName());
+			}
+			else {
+				packFile(zipFile, subDir, files[i]);
+			}
+		}
+	}
+
+	/**
+	 * pack a given file
+	 * @param zipFile  the ZIP archive to pack to
+	 * @param dir  the directory name to append to name of file entry inside archive
+	 * @param file  the file to pack
+	 * @throws IOException
+	 */
+	private void packFile(ZipOutputStream zipFile, String dir, File file) throws IOException
+	{
+		FileInputStream fileinputstream = new FileInputStream(file);
+		byte buf[] = new byte[fileinputstream.available()];
+		fileinputstream.read(buf);
+		String dirWithSlashes = dir.replace('\\', '/');
+		//System.out.println("zipping " + dirWithSlashes + "/" + file.getName());
+		ZipEntry ze = new ZipEntry(dirWithSlashes + "/" + file.getName());
+		ze.setMethod(ZipEntry.DEFLATED);
+		zipFile.putNextEntry(ze);
+		zipFile.write(buf, 0, buf.length);
+		zipFile.closeEntry();
+		fileinputstream.close();
+	}
+
   
 
   /* ---- Hilfsfunktionen ---- */

--
Gitblit v1.9.3