Dateien mit APEX in Datenbanktabellen hochladen: Möglichkeiten ...
Dass Dateien mit einer APEX-Anwendundung in Tabellen hochgeladen werden
müssen, ist eine gängige Anforderung. Und seit den ersten Versionen von
APEX hat sich hier auch eine ganze Menge getan. Während man früher den Prozess
komplett "von Hand" programmieren musste, bietet APEX heute fertige
Komponenten an - einfache Fälle lassen sich damit ohne PL/SQL-Programmierung
lösen. In diesem Tipp stellen wir beide Varianten vor - neben der einfachen
auch die "manuelle Programmierung"; denn für "ausgefallene" Anforderungen wird
diese immer noch gebraucht ...
Vorbereitungen
Zunächst wird eine Tabelle benötigt. Neben der Spalte vom Typ BLOB
für den Dateiinhalt werden noch weitere für die "Metadaten" der Datei
benötigt - am wichtigsten ist eine Spalte für den Dateinamen (DATEINAME)
und eine für den Dateityp (MIMETYPE). Legen Sie die Tabelle also wie
folgt an.
Datei-Upload mit APEX-Komponenten: ohne Programmierung
Erzeugen Sie dann ein Formular zum Hochladen. Für diese Tabelle wird
tatsächlich nur ein Formularfeld benötigt. Erstellen Sie also eine
neue, Anwendungsseite mit einer HTML Region hinzu. Dieser Region
Fügen Sie dann ein neues Formularelement zum Hochladen einer Datei (P1_DATEI) hinzu
(Abbildung 1).
Abbildung 1: Formularelement vom Typ "Datei hochladen"
Stellen Sie die Position und das Label des Elementes nach Wunsch ein;
der interessante Bereich sind die Einstellungen (Settings) des Elements (Abbildung 2).
Abbildung 2: Einstellungen zum Element vom Typ "Datei hochladen"
- Als Storage Type wählen Sie BLOB column specified in Item Source attribute aus
- Als Mimetype Column geben Sie MIMETYPE an.
- Als Filename Column geben Sie DATEINAME an.
- Die Characterset Column können Sie leer lassen.
- Die BLOB Last Updated Column ist LETZTE_AENDERUNG.
- Und Display Download Link stellen Sie auf No.
Navigieren Sie dann weiter zum Bereich Quelle (Source). Stellen Sie
dort den Source Type auf Database Column (achten Sie darauf, dass
Source Used auf "Always, replacing any ..." steht) und geben Sie
DATEIINHALT als Database Column Name an. Mit einem Klick auf
Element erstellen legen Sie das Formularelement an.
Abbildung 3: Das neue Element hat die Quelle "Database Column"
Anschließend brauchen Sie noch ein verstecktes Element P1_ID und eine
Schaltfläche zum Absenden. Wenn Sie die Seite nun starten, sieht soweit
alles vollständig aus; Sie können auch schon eine Datei auswählen und
hochladen; es passiert nur nichts: Ihre Tabelle bleibt (noch) leer.
Erzeugen Sie also als nächstes einen neuen Prozess (Abbildung 4).
Abbildung 4: Einen neuen Prozess anlegen
Wählen Sie Data Manipulation als Prozesstyp aus (Abbildung 5).
Abbildung 5: Prozesstyp festlegen
Nachdem Sie dem Prozess einen Namen gegeben und den Ausführungspunkt
festgelegt haben, kommen zum Schluß die Prozess-Einstellungen. Tragen
Sie TAB_DATEIEN als Tabelle ein und legen Sie fest, dass ID die Primärschlüsselspalte
ist und dass P1_ID das Element für den Primärschlüssel ist. Speichern Sie
den Prozess danach ab.
Abbildung 6:Einstellungen zur Tabelle und zum Primärschlüssel
Nun ist alles fertig. Wenn Sie die Seite nun starten, eine Datei hochladen
und anschließend (per SQL Workshop) in Ihre Tabelle schauen, sehen Sie, wie
die Datei hochgeladen wurde (ein Bericht "nebendran" tut es natürlich auch).
Abbildung 7: Die Anwendungsseite zum Datei-Upload ist fertig
Mehr Kontrolle: Dateien hochladen mit PL/SQL
Die bis hierhin beschriebene Vorgehensweise ist sehr einfach in der
Umsetzung und kann sogar mit "normalen" Formularfeldern kombiniert werden. Wenn
Sie ein Formular auf eine Tabelle erzeugen, wird das Dateiauswahlfeld automatisch
für die BLOB-Spalte generiert. Das Verfahren
erlaubt jedoch keine Eingriffe in das SQL Insert-Kommando, mit
dem die Datei tatsächlich in die Tabelle abgelegt wird. Wenn hier neben
dem reinen Speichern zusätzliche Logik gefordert ist, stößt der automatisierte
Prozess an seine Grenzen - eigener PL/SQL-Code muss eingehängt werden. Als nächstes
stellen wir also vor, wie Sie den Datei-Upload "von Hand" programmieren.
Fügen Sie Ihrer Anwendung noch eine leere Seite mit einer HTML-Region hinzu. Legen
Sie wiederum ein Element vom Typ Datei hochladen (P2_DATEI) an, bei den Einstellungen (Settings)
gehen Sie jedoch anders vor. Wie in Abbildung 8 dargestellt, wählen Sie Tabelle WWV_FLOW_FILES
als Storage Type aus. Mit Element erstellen speichern Sie schließlich ab.
Abbildung 8: Formularelement "Datei hochladen" mit "WWV_FLOW_FILES" als "Storage Type"
Das bedeutet, dass die Datei nicht in Ihre eigene, sondern in die APEX-Systemtabelle
WWV_FLOW_FILES gespeichert wird. Mit eigenem PL/SQL-Code können Sie diese dort
herausholen, bearbeiten und in ihre eigene Tabelle speichern.
Übrigens: Auch beim vorne beschriebenen automatischen Upload-Prozess wird die Datei
zunächst in der Systemtabelle WWV_FLOW_FILES abgelegt. Der automatische DML-Prozess
nimmt sie heraus und speichert sie in Ihre Tabelle ab.
Legen Sie danach wie vorhin eine Schaltfläche zum Absenden der Seite an; das versteckte
Element P2_ID brauchen Sie nicht unbedingt. Danach geht es an das Einrichten des
Prozesses. Erstellen Sie einen neuen Prozess (Abbildung 4) und wählen Sie
PL/SQL als Prozesstyp aus (Abbildung 9).
Abbildung 9: Prozesstyp "PL/SQL" wählen
Hinterlegen Sie folgenden PL/SQL-Code.
Da das Speichern in die Tabelle hier von ihrem eigenen PL/SQL-Code erledigt
wird, können Sie hier beliebige Dinge tun: Ob es darum geht, parallel in
eine zweite Tabelle zu schreiben,
den BLOB in einen CLOB umzuwandeln oder ein Bild mit den Prozeduren und Funktionen
des Paketes ORDIMAGE zu bearbeiten - alles kein Problem.
Fazit
Es ist sehr einfach, Dateien mit APEX in eigene Tabellen hochzuladen. In
einfach gelagerten Fällen kommt man komplett ohne Programmierung aus; die
APEX-Standardkomponenten erledigen die ganze Arbeit. Wie immer (und das ist
das Gute) ist APEX bei komplexeren Anforderungen völlig offen -
das Speichern kann auch mit eigenem Code realisiert werden. Und die letztere
Option öffnet eine APEX-Anwendung auch für ausgefallene Dinge ...
Zurück zur Community-Seite
|