Logo Oracle Deutschland   Application Express Community
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.

create table tab_dateien(
  id               number(10),
  dateiname        varchar2(200),
  mimetype         varchar2(100),
  dateiinhalt      blob,
  hochgeladen_am   date not null,
  letzte_aenderung date not null,
  constraint pk_dateien primary key (id)
)
/

create sequence seq_dateien
/

create or replace trigger tr_bui_dateien
before insert or update on tab_dateien
for each row
begin
  if inserting then 
    select seq_dateien.nextval into :new.id from dual; 
    :new.hochgeladen_am := sysdate;
    :new.letzte_aenderung := sysdate;
  end if;
  if updating then
    :new.letzte_aenderung := sysdate;
  end if;
end;
/

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

Formularelement vom Typ "Datei hochladen"

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

Einstellungen zum Element vom Typ "Datei hochladen"

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.

Das neue Element hat die Quelle "Database Column"

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

Einen neuen Prozess anlegen

Abbildung 4: Einen neuen Prozess anlegen

Wählen Sie Data Manipulation als Prozesstyp aus (Abbildung 5).

Prozesstyp "Data Manipulation" auswählen
Automated Row Processing auswählen

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.

Einstellungen zur Tabelle und zum Primärschlüssel

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

Die Anwendungsseite zum Datei-Upload ist fertig

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.

Formularelement "Datei hochladen" mit "WWV_FLOW_FILES" als "Storage Type"

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

Prozesstyp "PL/SQL" wählen

Abbildung 9: Prozesstyp "PL/SQL" wählen

Hinterlegen Sie folgenden PL/SQL-Code.

declare
  v_datei     blob;
  v_dateiname tab_dateien.dateiname%type;
  v_mimetype  tab_dateien.mimetype%type;
begin
  begin
    select
      blob_content,
      filename,
      mime_type
    into v_datei, v_dateiname, v_mimetype
    from wwv_flow_files 
    where name = :P2_DATEI;
  
    -- Der Blob in V_DATEI kann hier weiter verarbeitet werden:
    -- * Umwandeln in ein CLOB
    -- * Bildbearbeitung mit ORDIMAGE-Methoden
    -- * ...

    insert into tab_dateien (dateiname, mimetype, dateiinhalt)
    values (v_dateiname, v_mimetype, v_datei);
 
    -- Wichtig: Die Datei muss aus WWV_FLOW_FILES gelöscht werden;
    -- das passiert nicht automatisch!
  
    delete from wwv_flow_files where name = :P2_DATEI;
  exception
    when NO_DATA_FOUND then null;
  end;
end;

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