Dateien verwalten mit Modul jdk.httpserver
ulrich
2024-01-15 8e6840f2eaefe0f7b4763acd5edace0187bf29d3
commit | author | age
8e6840 1 /*
U 2   http-cm - File management extensions to jdk.httpserver
3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.httpserver.cm.actor;
020a97 19
U 20 import static de.uhilger.httpserver.cm.FileManager.STR_SLASH;
21 import java.io.File;
22 import java.io.FileInputStream;
23 import java.io.FileOutputStream;
24 import java.io.IOException;
25 import java.util.zip.Adler32;
26 import java.util.zip.CheckedOutputStream;
27 import java.util.zip.ZipEntry;
28 import java.util.zip.ZipOutputStream;
29
30 /**
8e6840 31  * Eine Klasse mit Methoden zum Packen von Dateien
U 32  * #
33  * @author Ulrich Hilger, 15. Januar 2024
020a97 34  */
U 35 public class Zipper {
36
37   /* --------------- Ordner packen ----------------- */
38
39   /**
40    * Einen Ordner packen.
41    * 
42    * Als Ziel wird eine neue Datei mit Dateiendung '.zip' erzeugt, die so 
43    * heisst wie der Ordner, der gapckt werden soll. Die Datei mit 
44    * dem gepackten Ordnerinhalt wird in dem Ordner angelegt, der den zu 
45    * packenden Ordner enthaelt.
46    * 
47    * @param fName  Name des zu packenden Ordners
48    * @param relPath  relativer Pfad zum Ordner, der gepackt werden soll  
49    * @return die Meldung mit dem Ergebnis. Wenn die Meldung nicht "ok" lautet
50    * wurde die ZIP-Datei nicht erzeugt und die Meldung nennt den Grund.
51    */
52   public String packFolder(String fName, String relPath, String base/*, HttpExchange e*/) {
53     if (!relPath.startsWith(".")) {    
54       try {        
55         //String fName = getFileName(e);
56         //logger.fine("fName: " + fName);
57         if (fName.endsWith(STR_SLASH)) {
58           File dir = new File(base, fName);
59           if(dir.isDirectory()) {
60             //logger.fine("absPath: " + dir.getAbsolutePath());
61             File parentDir = dir.getParentFile();
62             StringBuilder fname = new StringBuilder();
63             fname.append(dir.getName());
64             fname.append(".zip");
65             File archiveFile = new File(parentDir, fname.toString());
66             pack(dir.getAbsolutePath(), archiveFile.getAbsolutePath());
67             return "ok";
68           } else {
69             return "kein Ordner";
70           }
71         } else {
72           return "kein Ordner";
73         }
74       } catch(Exception ex) {
75         String result = ex.getLocalizedMessage();
76         //logger.log(Level.SEVERE, result, ex);
77         return result;
78       }
79     } else {
80       return "Falsche relative Pfadangabe";
81     }
82   }
83   
84     /**
85      * pack the contents of a given folder into a new ZIP compressed archive
86      * @param folder  absolute path and name of the folder to pack
87      * @param archive  absolute path and name of the archive to create from the given files
88      * @throws Exception
89      */
90     private boolean pack(String folder, String archive) throws Exception {
91         File file = new File(archive);
92         FileOutputStream fos = new FileOutputStream(file);
93         CheckedOutputStream checksum = new CheckedOutputStream(fos, new Adler32());
94         ZipOutputStream zos = new ZipOutputStream(checksum);
95         pack(zos, folder, "");
96         zos.flush();
97         zos.finish();
98         zos.close();
99         fos.flush();
100         fos.close();
101         return true;
102     }
103
104     /**
105      * go through the given file structure recursively
106      * @param zipFile  the ZIP file to write to
107      * @param srcDir  the directory to pack during this cycle
108      * @param subDir  the subdirectory to append to names of file entries inside the archive
109      * @throws IOException
110      */
111     private void pack(ZipOutputStream zipFile, String srcDir, String subDir) throws IOException {
112         File[] files = new File(srcDir).listFiles();
113         for(int i = 0; i < files.length; i++) {
114             if(files[i].isDirectory()) {
115                 pack(zipFile, files[i].getAbsolutePath(), subDir + File.separator + files[i].getName());
116             }
117             else {
118                 packFile(zipFile, subDir, files[i]);
119             }
120         }
121     }
122
123     /**
124      * pack a given file
125      * @param zipFile  the ZIP archive to pack to
126      * @param dir  the directory name to append to name of file entry inside archive
127      * @param file  the file to pack
128      * @throws IOException
129      */
130     private void packFile(ZipOutputStream zipFile, String dir, File file) throws IOException
131     {
132         FileInputStream fileinputstream = new FileInputStream(file);
133         byte buf[] = new byte[fileinputstream.available()];
134         fileinputstream.read(buf);
135         String dirWithSlashes = dir.replace('\\', '/');
136         //System.out.println("zipping " + dirWithSlashes + "/" + file.getName());
137         ZipEntry ze = new ZipEntry(dirWithSlashes + "/" + file.getName());
138         ze.setMethod(ZipEntry.DEFLATED);
139         zipFile.putNextEntry(ze);
140         zipFile.write(buf, 0, buf.length);
141         zipFile.closeEntry();
142         fileinputstream.close();
143     }
144
145       
146 }