Speichern und Zugreifen auf Dateianhänge in BLOB-Datentypen über Oracle APEX
Hier ist das Schemadesign für die von mir verwendete Tabelle, die eine BLOB-typisierte Datenspalte enthält. Hinweis:Dies ist nicht das Design der endgültigen Lösung; Folgen Sie einfach den Änderungen, sobald sie kommen, damit Sie verstehen, was ich über einige Einschränkungen der APEX-Assistenten zur Formular- und Berichterstellung herausgefunden habe.
Erster Versuch:Einrichten der APEX-Tabelle, des Formulars und des Berichts
Tabelle:MY_DOC_STACK Erster Layoutversuch
Die Spalte DOC_FILE
ist der BLOB-Typ, der den eigentlichen Dokumentanhang speichert. So sehen das Formular und der Bericht aus, die mit dem APEX-Anwendungsassistenten erstellt wurden, der direkt auf die Tabelle verweist:
HINZUFÜGEN eines DOKUMENTS zum BLOB-typisierten Feld
Die Berichtsabfrage scheint wie unten gezeigt zu funktionieren:
Hier ist eine Liste weiterer Datensätze mit Dokumentanhängen:
Beispielberichtsausgabe mit mehreren Datensätzen
Das Problem tritt auf, wenn versucht wird, die Datei herunterzuladen, die in das BLOB-Feld eingefügt wurde:
Es ist subtil aus dem Bild, aber der identifizierte Mime-Typ:Application/Octet-Stream
ist ein Indikator dafür, dass das APEX-Formular den Dateityp (Microsoft Word, docx) verloren hat, den ich gerade hochgeladen hatte. Die gespeicherte Datei ist nur ein Haufen Müllzeichen. Der Versuch, die Dateiendung zu ändern, hilft auch nicht.
Zweiter (überarbeiteter) Versuch:Anpassungen am APEX-Anwendungsdesign für Blob-/Dokumentenhandhabung
Obwohl die Anwendungsregionen und ihre Komponenten nicht sofort nach Abschluss des Assistenten funktionierten, gibt es nur ein paar geringfügige Änderungen, um ihn in einen funktionsfähigen Zustand zu versetzen. Genauere Betrachtung des Formularelements PX_DOC_FILE
zeigt, dass BLOB-Formularelemente einige zusätzliche Metainformationen über die an den Datensatz angehängte Datei benötigen:
Ich ging weiter und definierte die zusätzlichen Spalten und fügte sie der BLOB-enthaltenden Tabelle (MY_DOC_STACK), dem hochzuladenden Apex-Formular und der Definition des Berichtsbereichs hinzu.
Beachten Sie, dass die Spaltennamen (der Einfachheit halber) den Anforderungen des Blob-Formularelements DOC_FILE
entsprechen .
Überarbeitetes Dokumentanhang-Apex-Formular
Ich dachte zunächst, man müsse schlau sein, um alle möglichen Werte von Mime-Typen (msword, pdf, zip usw.) zu antizipieren, aber das war unnötig. Ebenso für die anderen Felder, die für den Zeichentyp und die zuletzt aktualisierten Spalten reserviert sind.
Überarbeiteter Dokument-Blob-Upload-Bericht
Überarbeitete Berichtsausgabe-Diskussion
-
[Eigentümer:AUDREY HEPBURN]:Ich habe den
MIME_TYPE
erzwungen mit meinem Formular zu "Bewerbung/msword"; Obwohl die Datei, die ich hochgeladen hatte, vom Typ ".docx" war, wurde sie beim erneuten Herunterladen über die Apex-Seite auf meinem lokalen Client als ".doc"-Format (das alte MS Word-Format) gespeichert. -
[Eigentümer:CHEVY CHASE]:Diesmal
MIME_TYPE
wurde nicht eingegeben und der Apex-Formularprozess/die Aktion hat dies dem Datensatz hinzugefügt, als er erstellt wurde:application/vnd.openxmlformats-officedocument.wordprocessingml.document
Dies ist wahrscheinlich das von
Microsoft Office 2013
festgelegte Format . DerFILE_NAME
Wert war benutzerdefiniert und die Erweiterung .docx wurde explizit hinzugefügt. Das Ergebnis war, dass das Herunterladen der Datei den Benutzer dazu veranlasste, die Datei standardmäßig mit der richtigen Anwendung auf meinem Client-Computer zu öffnen:MS Word (Version 2013). -
[Inhaber:CARRIE FISHER]:Dasselbe wie Testfall (2), aber stattdessen wird ein Adobe PDF (Portable Document Format) verwendet. Gleiches Verhalten außer
MIME_TYPE
hat sich als application/pdf identifiziert; Datei wie erwartet geöffnet.
Mehr Diskussion:
All diese Probleme stammen von den generischen DML-APIs, die Apex verwendet, um Einfügungen, Aktualisierungen und Löschungen aus dem Schema der Anwendung zu verwalten, höchstwahrscheinlich ist es Teil der Härtung von Apex gegen SQL-Injection-Angriffe. Das direkte INSERT
und SELECT
Anweisungen, die in Ihrem SQL-Client verwendet werden, ist nicht die gleiche Art und Weise, wie ein Standardformularentwurf (von einem Anwendungsassistenten) eingerichtet wird, um DML-Transaktionen zu verwalten.
Beachten Sie, dass der Seitenprozess:Process Row of MY_DOC_STACK
sieht eher parametergesteuert aus. Wenn es irgendwo einen DML-Vorgang gibt, basiert dieser zunächst auf der sorgfältigen Überprüfung jeder Eingabevariablen, die über das Apex-Formular übermittelt wird.
Es gibt viele andere Möglichkeiten, wie Apex DML-Transaktionen verwalten kann; ... diese Lösung konzentriert sich auf das, was dem OP höchstwahrscheinlich begegnet ist.
Viel Glück!