Dateitransfer in den Verzeichnisbaum des Betriebssystems
von Heinz-Josel Wrobel, DATA MART Consulting GmbH ( http://www.datamart.de/)
Erscheinungsmonat |
APEX-Version |
Datenbankversion |
Juni 2011 |
ab 3.x |
ab 9.2 |
In den vergangenen Newslettern wurde mehrmals über das Dateihandling berichtet.
In diesem Beitrag möchte ich einen Weg vorstellen, Dateien über APEX in
das Verzeichnis des Betriebssystems zu platzieren.
Der vorliegende Weg ermöglicht das Dateihandling selbst auf einer XE-Datenbank. Der
Tipp basiert auf dem bereits vorhandenen Tipp
Dateien mit APEX in Datenbanktabellen hochladen: Möglichkeiten..
Dies erläutere ich an dieser Stelle nicht erneut, sondern verweise
nur auf die entsprechenden Seiten im Tutorial. Nachdem nun
die gewünschte Datei mit dem File-Browse-Button bestimmt wurde und
die Seite "abgeschickt" bzw. "submitted" wurde, liegt diese
Datei als BLOB-File in der Datenbank im Schema FLOWS_FILES in
der Tabelle WWV_FLOW_FILE_OBJECTS$. Diese wird
jedoch nicht direkt angesprochen - der Zugriff erfolgt über die View WWV_FLOW_FILES.
In besagtem Tutorial wird die Datei von dort aus in die Zieltabelle kopiert - hier werden
wie Sie in das Verzeichnis des Betriebssystem platzieren.
Die PL/SQL-Prozedur hierfür benötigt zwei Übergabeparameter, zum einen den
Dateinamen der zu transportierenden Datei und zum anderen den Verzeichnisnamen, also
den Ort, an dem die Datei platziert werden soll.
Der Verzeichnisname muss zuvor vom DBA als Directory
in der Datenbank definiert werden und das APEX-Parsing-Schema muss mit den nötigen
Schreib- und Leserechten ausgestattet werden.
Der Name der Datei kann aus einem APEX-Element (bspw. das File-Browse-Item) entmommen werden.
Alternativ könnten über einen Report alle Dateien aus der View WWV_FLOW_FILES angezeigt werden und so eine spezielle Datei bearbeitet werden.
Der zweite Parameter, der Verzeichnisname, ist optional. Er ist konstant und könnte auch innerhalb der Prozedur definiert sein. Andererseits könnte es auch erforderlich sein, unterschiedliche Dateien in unterschiedliche Verzeichnisse abzulegen. So erhöht der Verzeichnis-Parameter die Flexibilität beim Arbeiten mit dieser Prozedur.
- Zunächst werden die Dateiinhalte mitsamt der Metadaten wie Dateiname oder Dateigröße aus der
View WWV_FLOW_FILES entnommen.
- Unter Zuhilfenahme des Datenbank-Packages UTL_FILE wird das Blob-File nun ins Dateisystem
geschrieben. Dateien bis zu einer Größe von 32kB können direkt, größere
Dateien müssen in Chunks zerlegt und schrittweise geschrieben werden, da UTL_FILE nicht
direkt mit BLOBs umgehen kann.
- Falls dieselbe Datei mehrmals hochgeladen wurde, lässt sich die Datei dennoch
eindeutig über die Spalte NAME bestimmen. Beim
Upload wird der Dateiname mit einem Präfix eindeutig gemacht. Der Inhalt des
File-Browse-Items wird entsprechend angepasst.
- Wenn die Datei ins Dateisystem geschrieben wurde, kann sie bei Bedarf mit einem
SQL DELETE Kommando wieder aus WWV_FLOW_FILES entfernt werden.
Auf diese Weise lassen sich alle Datei-Typen platzieren. Erprobt wurde das
geschilderte Verfahren mit CSV-Dateien, die für einen Einlese-Prozess
bereitgestellt werden müssen, mit RPT-Dateien für Oracle-Reports, aber auch
mit Word- und PDF-Dateien. Eine maximale Dateigröße wird höchstens durch die
Begrenzungen einer 32-Bit-Umgebung gesetzt.
Da UTL_FILE Dateien nicht nur schreiben, sondern auch lesen kann, könnte es auch
genutzt werden, um Dateiinhalte des Betriebssystems zum Download anzubieten. Wer auf
einer Standard- oder gar auf einer Enterprise Edition arbeitet, kann noch mehr
mit dem Betriebssystem interagieren - dazu mehr im Tipp
Betriebssystem-Kommandos und Dateisystemzugriffe mit Application Express. Daneben dürften die Tutorials zum Datei-Upload als auch zum Datei-Download interessant sein.
Zurück zur Community-Seite
|