Dateiverwaltung für die WebBox
ulrich
2018-04-03 e2f0bbb60123a12b84d86062789c2fb605f37dba
src/java/de/uhilger/filecms/api/FileMgr.java
@@ -19,10 +19,14 @@
package de.uhilger.filecms.api;
import de.uhilger.filecms.data.FileRef;
import de.uhilger.filecms.data.Inhalt;
import de.uhilger.filecms.pub.AbstractComparator;
import de.uhilger.filecms.pub.FileNameComparator;
import de.uhilger.wbx.Bild;
import de.uhilger.wbx.WbxUtils;
import static de.uhilger.wbx.web.FeedServlet.WBX_FILE_BASE;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
@@ -38,8 +42,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;
@@ -139,7 +146,70 @@
    }
    return files;
  }
  /**
   * Wie list nur mit drill down
   *
   * TODO '/data' muss noch variabel gestaltet werden
   *
   * @param relativePath
   * @param maxTiefe
   * @param maxAnzahl
   * @return
   */
  /*
    Beispiel
    http://localhost:8097/file-cms/svc?c=de.uhilger.filecms.api.FileMgr&m=collectFiles&p=/data/admin/journal/&p=2&p=200&f=JSONNICE
  */
  public List<Inhalt> collectFiles(String relativePath, int maxTiefe, int maxAnzahl) {
    Bild bild = new Bild();
    WbxUtils wu = new WbxUtils();
    String basis = wu.getJNDIParameter(WBX_FILE_BASE, WbxUtils.EMPTY_STRING);
    String pubDirName = wu.getJNDIParameter(WbxUtils.WBX_PUB_DIR_NAME, WbxUtils.WBX_DEFAULT_PUB_DIR_NAME);
    String relPath = relativePath.replace("/data", pubDirName);
    String absPath = basis + relPath;
    ArrayList beitraege = new ArrayList();
    ArrayList<Inhalt> files = new ArrayList<>();
    wu.collectFiles(new File(absPath), 0, beitraege, maxTiefe, maxAnzahl);
    Iterator i = beitraege.iterator();
    while(i.hasNext()) {
      File beitrag = (File) i.next();
      Inhalt cont = new Inhalt();
      cont.setMimetype(bild.getMimeType(beitrag));
      cont.setIsDirectory(beitrag.isDirectory());
      cont.setIsHidden(beitrag.isHidden());
      cont.setLastModified(beitrag.lastModified());
      cont.setLength(beitrag.length());
      /*
        den 'https://..'-Teil bis vor dem
        ContextPath ermitteln
      */
      StringBuffer requestUrl = getRequest().getRequestURL();
      String contextPath = getRequest().getContextPath();
      int pos = requestUrl.indexOf(contextPath);
      /*
        den Teil des Pfades ermitteln, der zwischen dem
        ContextPath zum oeffentlichen Ordner und dem Dateiname
        steht
      */
      String absolutePath = beitrag.getAbsolutePath();
      absolutePath = absolutePath.replace(beitrag.getName(), "");
      absolutePath = absolutePath.replace(pubDirName, "");
      String part = relativePath.replace("/data", "");
      int pos2 = absolutePath.indexOf(part);
      String mittelteil = absolutePath.substring(pos2);
      mittelteil = mittelteil.replace(part, "");
      cont.setBase(requestUrl.substring(0, pos));
      cont.setUrl(/*requestUrl.substring(0, pos) + "/data" + */ mittelteil + beitrag.getName());
      files.add(cont);
    }
    return files;
  }
  
  public FileRef newFolder(String relPath, String folderName) {
    if (!relPath.startsWith(".")) {
@@ -447,6 +517,9 @@
      return "Pfad micht erlaubt.";
    }
  }
  /* --------- ZIP entpacken ---------------- */
  public String extractZipfile(String relPath, String filename) {
    String result = null;
    if (!relPath.startsWith(".")) {    
@@ -511,6 +584,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 ---- */