Ich würde gerne über ein Webfrontend ein zip file hochladen lassen was eine gewisse verzeichnisstruktur und dateien beinhaltet. dieses file soll dann entzippt werden und je nachedem in welchem ordner sich die dateien befinden in ein entsprechendes FTP Verzeichnis weitergeleitet werden.
Meine Frage bezieht sich auf die Fähigkeiten der zip API:
Mit Windows kann ich ja ganze Verzeichnisstrukturen zippen, ist es mit der API auch möglich diese wieder korrekt abzubilden? Also auch herauszubekommen in welchem verzeichnis man sich befindet etc?
Zur Ergänzung: Mein Problem: Ich soll einen Massenupload von Bildern in Unterverzeichnissen über ein Webfrontend realisieren ohne Activex oder Applets. (sondern mit JSP, JAVA, Struts). Doch ich kann mit dem HTML Upload Formular pro request ja nur eine Datei hochladen. Deshalb dachte ich diese eine Datei könnte ein zip File sein was ich dann anschliessend bearbeite. Sollten euch bessere Lösungswege einfallen würde ich mich auch sehr freuen.
Meine Frage bezieht sich auf die Fähigkeiten der zip API:
Mit Windows kann ich ja ganze Verzeichnisstrukturen zippen,
ist es mit der API auch möglich diese wieder korrekt
abzubilden? Also auch herauszubekommen in welchem verzeichnis
man sich befindet etc?
ja, das geht schon:
import java.io.\*;
import java.util.\*;
import java.util.zip.\*;
public class ZipTest
{
public static void main(String args[])
{
try
{
// Zip File
ZipFile file = new ZipFile("test.zip");
// Ziel Verzeichnis
String destinationDir = "zipContent/";
Enumeration enum = file.entries();
while(enum.hasMoreElements())
{
ZipEntry entry = (ZipEntry)enum.nextElement();
String entryName = entry.getName();
System.out.println("Entpacke "+entryName);
// InputStream des aktuellen Eintrags
InputStream is = file.getInputStream(entry);
// Ziel Datei
File destinationFile = new File(destinationDir + entryName);
/\* Wenn Verzeichnis, dann muß dieses erst angelegt werden
\* sonst gibt's später beim schreiben der Files eine Exception
\*/
if(entry.isDirectory())
{
destinationFile.mkdirs();
}
/\* Wenn Datei, dann diese per OutputStream
\* schreiben
\*/
else
{
OutputStream os = new FileOutputStream(destinationFile);
byte[] buffer = new byte[1024];
int readBytes = 0;
while((readBytes = is.read(buffer)) \> 0)
{
os.write(buffer,0,readBytes);
}
os.close();
}
is.close();
}
}
catch(Exception e)
{
e.printStackTrace();
}
System.exit(0);
}
}
Wichtig ist, daß du Verzeichnisse anlegst, bevor du Dateien dort reinschreibst. Bei meinem Quick & Dirty Test kam der Verzeichnis-Eintrag immer vor den Dateien, ich weiß aber nicht ob das grundsätzlich so ist, evtl. ist es besser bei jeder Datei zu prüfen, ob das Zielverzeichnis existiert, anderfalls bekommst du beim Versuch eine Datei in ein nicht vorhandens Verzeichis zu schreiben eine FileNotFoundException
Eine frage hab ich aber noch. wird dann das ganze verzeichnis rekursiv ausgelesen?.
weil ich habe ja keine lehren verzeichnisse sondern wo datein drin sind, d.h ich müsste irgendwie auch noch jedes file abprüfen in welchem verzeichnis es denn gestanden hat und entsprechend entpackt werden soll.
Eine frage hab ich aber noch. wird dann das ganze verzeichnis
rekursiv ausgelesen?.
weil ich habe ja keine lehren verzeichnisse sondern wo datein
drin sind, d.h ich müsste irgendwie auch noch jedes file
abprüfen in welchem verzeichnis es denn gestanden hat und
entsprechend entpackt werden soll.
d.h. es gibt für ein Verzeichnis auch ein Entry-Object, auch wenn das WinZIP nicht anzeigt. So wie es aussieht wird das auch immer vor den Dateien zurückgegeben, aber prinzipiell kann man nicht sicher sagen in welcher Reihenfolge die Einträge in der Enumeration vorliegen.
Die saubere Lösung wäre daher eher:
File destinationFile = new File(destinationDir + entryName);
if(!entry.isDirectory())
{
File parent = destinationFile.getParentFile();
if(!parent.exists())
{
System.out.println("Verzeichnis muß noch angelegt werden: "+parent.toString());
parent.mkdirs();
}
OutputStream os = new FileOutputStream(destinationFile);
byte[] buffer = new byte[1024];
int readBytes = 0;
while((readBytes = is.read(buffer)) \> 0)
{
os.write(buffer,0,readBytes);
}
os.close();
}
is.close();