|
ZIP-Archive ein- und auspacken ... mit Application Express
Der Umgang mit ZIP-Archiven ist etwas ganz alltägliches ... und so ist der
Wunsch naheliegend,
auch in Application Express-Anwendungen mit ZIP-Archiven
umgehen zu können. So ist es denkbar, ein ZIP-Archiv aus mehreren Dokumenten
(BLOBs) zu erstellen und via APEX_MAIL als Email zu
versenden. Eine andere
Anwendung wäre der umgekehrte Weg: Der Anwender lädt ein ZIP-Archiv über eine
Formularseite hoch, die Anwendung packt es automatisch aus und speichert die
unkomprimierten Dateien als BLOBs in eine Tabelle ab.
Ein erster Ansatz zur Lösung dieser Anforderung wäre
das PL/SQL-Paket UTL_COMPRESS. Allerdings kann dies
nur einen einzigen BLOB komprimieren oder
dekomprimieren, ist also mit dem Unix
gzip/gunzip vergleichbar. Ein ZIP-Archiv
mit mehreren Dateien und der zugehörigen
"Verzeichnisstruktur" kann es nicht bearbeiten. Allein mit PL/SQL lässt sich
dies also nicht lösen ...
... allerdings gibt es seit Oracle8i eine vollständige
Java-Umgebung in der Datenbank;
und Java kann seit Version 1.1 mit ZIP-Archiven umgehen. Der heutige Tipp
basiert im wesentlichen auf den Klassen des Java-Pakets
java.util.zip und dem
Blog Posting "Zip It" von Joel Kallman. Joel's Code
haben wir an dieser Stelle ein wenig erweitert, so dass ZIP-Archive nicht
nur erstellt, sondern auch "ausgepackt" werden können ...
Damit Sie im APEX auch ZIP-Archive mit Umlauten verwenden können, müssen wir
noch einige zusätzliche Vorbereitungen erledigen - Diese Variante des Tipps unterstützt auch ZIP-Archive mit Umlauten vollständig.
1. OpenSource Implementierung für ZIP-Algorithmus inkl. Erweiterung für Umlaute einspielen
Der Grund für die fehlende Unterstützung von Umlauten in der Standard-Implementierung
liegt in einem schon recht lange existierenden Bug in den Java ZIP-Klassen von Sun: Diese
setzen voraus, dass Dateinamen in ZIP-Archiven
in Unicode (UTF-8) kodiert werden. Das ist bei Werkzeugen wie WinZIP aber nicht der Fall;
diese kodieren in der Codepage 850. Wenn in Dateinamen keine Umlaute vorhanden sind, ist
dies völlig unproblematisch - ist dies jedoch der Fall, so wird eine Fehlermeldung
wegen ungültiger Zeichen ausgelöst; das ZIP-Archiv kann nicht ausgepackt werden.
Aber nun zur Lösung: Es gibt eine OpenSource Implementierung für den ZIP-Algorithmus,
die als Basis für unsere Problemlösung dienen kann ... Laden Sie daher als erstes
die jazzlib herunter - nehmen Sie die
Binärvariante der Version 0.07: jazzlib-binary-0.07.zip .
Spielen Sie dieses Archiv nun in die Datenbank ein. Führen Sie von der Kommandozeile
aus folgenden Befehl aus:
Sie sollten in etwa folgende Ausgabe sehen:
Spielen Sie nun (ebenfalls mit dem Kommando loadjava) die Java-Klassen
ZipInputStream.class
(Quellcode)
und
ZipOutputStream.class
(Quellcode)
ein:
2. Wrapper Klassen und PL/SQL-Package installieren
Spielen Sie nun das folgende SQL-Skript
(Download als Skript) in das
Parsing Schema Ihrer
Application Express-Anwendung ein.
3. Package-Beschreibung
Anschließend steht Ihnen das PL/SQL-Paket ZIP zur Verfügung:
| PROCEDURE OPEN(P_ZIPFILE BLOB, P_ENCODING VARCHAR2) |
Öffnet das im BLOB enthaltene ZIP-Archiv |
PROCEDURE IS_OPEN RETURN NUMBER |
Gibt "1" zurück, wenn ein ZIP-Archiv geöffnet ist, ansonsten "0" |
FUNCTION NEXT RETURN NUMBER |
Navigiert zur nächsten Datei im ZIP-Archiv und gibt "1" zurück. Wenn
das Ende des ZIP-Archivs erreicht ist, wird "0" zurückgegeben.
|
FUNCTION GET_ENTRY RETURN ZIP_ENTRY_T |
Ruft die Datei aus dem ZIP-Archiv als Datentyp ZIP_ENTRY_T
ab. Die Datei selbst ist darin als Attribut CONTENT vom Typ BLOB verfügbar.
|
| PROCEDURE CLOSE |
Schließt das gerade geöffnete ZIP-Archiv |
FUNCTION LIST(P_ZIPFILE BLOB, P_ENCODING VARCHAR2) RETURN ZIP_ENTRY_CT |
Diese Table-Function listet die Inhalte des ZIP-Archivs in P_ZIPFILE auf; das
ZIP-Archiv muss hierfür nicht geöffnet werden. |
FUNCTION ZIP(P_QUERY VARCHAR2, P_ENCODING VARCHAR2) RETURN BLOB |
Erstellt ein ZIP-Archiv; die in P_QUERY übergebene
SQL-Abfrage muss eine VARCHAR2- (Dateiname) und eine BLOB-Spalte (Inhalt)
selektieren.
|
FUNCTION ZIP(P_CURSOR REF CURSOR, P_ENCODING VARCHAR2) RETURN BLOB |
Erstellt ein ZIP-Archiv und nimmt einen Cursor entgegen; ansonsten funktioniert
sie genauso wie die vorhergehende Funktion ZIP.
|
4. erster Test
Nun wagen wir einen ersten Test: Wir wollen eine Application Express-Seite
erstellen, auf welcher ein ZIP-Archiv hochgeladen werden kann. Beim Hochladen
soll es automatisch ausgepackt und die Dateien in die Tabelle
MEINE_DOKUMENTE
übernommen werden. Erstellen Sie also zunächst die Tabelle
MEINE_DOKUMENTE.
Erzeugen Sie danach eine Application Express-Anwendung und darin eine Seite
mit einem Bericht auf die Tabelle. Nehmen Sie für den Bericht die folgende
SQL-Abfrage:
Fügen Sie anschließend ein Element vom Typ
Datei durchsuchen mit Namen
P1_DATEI und eine Schaltfläche hinzu.
Die Seite sollte dann in etwa wie in Abbildung 1 aussehen ...
Abbildung 1: ZIP-Archive in APEX hochladen: Die Anwendungsseite
Wenn Sie nun eine Datei auswählen und auf die Schaltfläche klicken,
passiert noch nichts - schließlich haben Sie noch keinen PL/SQL-Prozeß
zum Auspacken des Archivs erstellt - dies geschieht nun: Erstellen Sie
einen Prozeß, der beim Weiterleiten der Seite
ausgelöst wird ( onSubmit)
und hinterlegen Sie folgenden PL/SQL-Code:
Probieren Sie es nun einmal aus - Wählen Sie ein ZIP-Archiv als Datei aus
und klicken Sie auf die Schaltfläche. Anschließend sollte die Seite in etwa
wie folgt aussehen ...
Abbildung 2: Das Ergebnis: Anwendungsseite nach dem Hochladen und Auspacken des ZIP-Archivs
Nun können Sie weiteren Code zum Umgang mit den ausgepackten Dateien hinzufügen. Gerade
wenn es darum geht, mehrere Dateien auf einmal hochzuladen oder bereitzustellen, kann dieses Paket
sehr hilfreich sein.
Zurück zur Community-Seite
|