Logo Oracle Deutschland   Application Express Community
ZIP-Archive ein- und auspacken ... mit Application Express
Erscheinungsmonat APEX-Version Datenbankversion
August 2015 ab 5.0 ab 11.1

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.

Ab APEX 5.0 ist der Umgang mit ZIP-Archiven denkbar einfach geworden - denn das PL/SQL Paket APEX_ZIP bringt die nötige Funktionalität mit und ist im APEX-Standardumfang enthalten. Das Einbinden zusätzlicher Bibliotheken ist, auch in Oracle11g, nicht mehr nötig.

ZIP-Archive bieten sich als Upload-Variante an, wenn viele Dateien hochzuladen sind. Anstelle vieler File-Upload-Felder oder eines besonders raffiniert implementierten Multi-File-Uploads reicht unter Umständen ein ganz einfaches File-Upload-Element aus, in dem der Anwender ein Zipfile hochlädt. Auf dem Server packt man dieses aus und alle Dateien kommen mit nur einem einzigen Upload-Vorgang auf dem Server an. Erstellen Sie also zunächst die Tabelle MEINE_DOKUMENTE.

create table MEINE_DOKUMENTE(
  ID            number(10),
  NAME          varchar2(4000),
  DOKUMENT      blob
)
/

create sequence SEQ_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:

select 
  id, name, dokument, dbms_lob.getlength(dokument) groesse 
from meine_dokumente

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 ...

ZIP-Archive in APEX hochladen: Die Anwendungsseite

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 neuen PL/SQL-Prozess wie folgt.

Neuen Prozess vom Typ PL/SQL anlegen

Abbildung 2: Neuen Prozess vom Typ PL/SQL anlegen

Hinterlegen Sie den folgenden PL/SQL Code.

declare
  l_upload_file   blob;
  l_unzipped_file blob;
  l_zip_files   apex_zip.t_files;
begin
  select blob_content into l_upload_file
  from apex_application_temp_files
  where name = :P1_DATEI;   

  l_zip_files := apex_zip.get_files(l_upload_file);

  for f in l_zip_files.first..l_zip_files.last loop
    l_unzipped_file := apex_zip.get_file_content(l_upload_file, l_zip_files(f));
  
    insert into MEINE_DOKUMENTE (id, name, dokument)
    values (seq_meine_dokumente.nextval, l_zip_files(f), l_unzipped_file);
  end loop;
exception 
  when NO_DATA_FOUND then null;
end;

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 - das ZIP-Archiv wurde ausgepackt und die Tabelle enthält die einzelnen Dateien.

Das Ergebnis: Anwendungsseite nach dem Hochladen und Auspacken des ZIP-Archivs

Abbildung 3: Das Ergebnis: Anwendungsseite nach dem Hochladen und Auspacken des ZIP-Archivs

Als nächstes erfahren Sie, wie Sie ZIP-Archive mit APEX_ZIP erstellen können. Angenommen, Sie wollen den Inhalt der Tabelle MEINE_DOKUMENTE per Email versenden. Zum Mailversand haben wir das Package APEX_MAIL, welches auch das Hinzufügen von Attachments zu einer Email unterstützt. Allerdings dürfte es keine gute Idee sein, jede Datei einzeln als Attachment an diese Mail anzuhängen. Es bietet sich an, ein ZIP-Archiv zu generieren und dieses zu versenden.

Fügen Sie Ihrer Anwendungsseite eine weitere Schaltfläche SEND_MAIL hinzu - danach kommt ein weiterer PL/SQL Prozess. Legen Sie diesen analog zum vorigen Prozess an, nur dass dieser hier bei Klick auf die Schaltfläche SEND_MAIL feuern soll. Hinterlegen Sie den folgenden PL/SQL-Code.

declare
  l_zipfile blob;
  l_msg_id  number; 
begin
  -- ZIP-Archiv erstellen
  for i in (
    select id, name, dokument from meine_dokumente
  ) loop
    apex_zip.add_file(l_zipfile, i.name, i.dokument);
  end loop;
  apex_zip.finish(l_zipfile);

  -- ZIP-Archiv per Mail versenden
  l_msg_id := apex_mail.send(
    p_to        => 'mail.adresse@meinefirma.de',
    p_from      => 'mail.adresse@meinefirma.de',
    p_body      => 'Hier sind einige Dateien - als ZIP',
    p_body_html => 'Hier sind einige Dateien - als ZIP',
    p_subj      => 'DATEIEN ALS ZIP-ARCHIV'
  );
  apex_mail.add_attachment(
    p_mail_id => l_msg_id,
    p_attachment => l_zipfile,
    p_filename   => 'Dateien.zip',
    p_mime_type  => 'application/zip'
  );
end;
Neuer Button SEND_MAIL in der APEX-Anwendung

Abbildung 4: Neuer Button SEND_MAIL in der APEX-Anwendung

Wenn Sie Ihre Seite starten und den neuen Button SEND_MAIL ausprobieren (Abbildung 4), sollten Sie danach in Ihrem Mailclient eine Nachricht sehen, die in etwa wie in Abbildung 5 aussieht (vorausgesetzt, der Mailserver ist in Ihrer APEX-Instanz korrekt eingerichtet).

Das Ergebnis: Eine Email mit einem ZIP-Archiv als Attachment

Abbildung 5: Das Ergebnis: Eine Email mit einem ZIP-Archiv als Attachment

Der Umgang mit ZIP-Archiven ist in APEX 5.0 denkbar einfach. Das PL/SQL Paket APEX_ZIP besteht zwar nur aus vier Prozeduren, damit lässt sich aber nahezu alles Wichtige umsetzen. Das Beste ist, dass APEX_ZIP zwar ein Teil von Application Express ist, aber auch, komplett unabhängig davon, in reinen PL/SQL-Umgebungen funktioniert. Der breiten Nutzung steht also nichts im Wege ...

Zurück zur Community-Seite