Ukládání a přístup k přílohám souborů v datových typech BLOB prostřednictvím Oracle APEX
Zde je návrh schématu pro tabulku, kterou jsem použil a která obsahuje datový sloupec typu BLOB. Poznámka:toto nebude návrh konečného řešení; stačí sledovat změny tak, jak přijdou, abyste pochopili, co jsem zjistil o několika omezeních průvodců vytvářením formulářů APEX a zpráv.
První pokus:Nastavení tabulky, formuláře a sestavy APEX
Tabulka:MY_DOC_STACK První pokus o rozvržení
Sloupec DOC_FILE
je typ BLOB, který ukládá skutečnou přílohu dokumentu. Toto je vzhled formuláře a sestavy vytvořené pomocí průvodce aplikací APEX, který ukazuje přímo na tabulku:
PŘIDÁNÍ DOKUMENTU do pole typu BLOB
Zdá se, že dotaz na přehled funguje následovně:
Zde je seznam dalších záznamů s přílohami dokumentů:
Ukázkový výstup sestavy s více záznamy
Problém je při pokusu o stažení souboru, který byl vložen do pole BLOB:
Z obrázku je to jemné, ale identifikovaný typ mime:Application/Octet-Stream
je indikátor, že formulář APEX ztratil přehled o typu souboru (Microsoft Word, docx), který jsem právě nahrál. Uložený soubor je jen hromada nesmyslných znaků. Nepomáhá ani pokus o změnu přípony souboru.
Druhý (revidovaný) pokus:Úpravy návrhu aplikace APEX pro manipulaci s objekty blob/dokumenty
Přestože oblasti aplikace a jejich součásti nefungovaly ihned po dokončení průvodce, existuje pouze několik drobných úprav, které jej uvedly do funkčního stavu. Bližší kontrola prvku formuláře PX_DOC_FILE
ukazuje, že prvky formuláře BLOB vyžadují některé další metainformace o souboru připojeném k záznamu:
Pokračoval jsem a definoval další sloupce a přidal je do tabulky obsahující BLOB (MY_DOC_STACK), formuláře Apex pro nahrávání a definice oblasti sestavy.
Všimněte si, že názvy sloupců (pro zjednodušení) byly vytvořeny stejné jako požadavky prvku formuláře Blob DOC_FILE
.
Revidovaný formulář přílohy dokumentu
Původně jsem si myslel, že člověk musí být chytrý, aby předvídal všechny možné hodnoty typů Mime (msword, pdf, zip atd.), ale to bylo zbytečné. Podobně pro ostatní pole vyhrazená pro typ znaku a naposledy aktualizované sloupce.
Revidovaná zpráva o nahrání objektu blob dokumentu
Revidovaná diskuse o výstupu zprávy
-
[Vlastník:AUDREY HEPBURN]:Vynutil jsem
MIME_TYPE
s mým formulářem na "Aplikace/msword"; ačkoli soubor, který jsem nahrál, byl typu „.docx“, jeho stažení zpět přes stránku Apex jej uložilo do mého místního klienta jako formát „.doc“ (starý formát MS Word). -
[Vlastník:CHEVY CHASE]:Tentokrát
MIME_TYPE
nebyl zadán a proces/akce formuláře Apex to přidal do záznamu, když byl vytvořen:application/vnd.openxmlformats-officedocument.wordprocessingml.document
Toto je pravděpodobně formát určený
Microsoft Office 2013
.FILE_NAME
hodnota byla definována uživatelem a přípona .docx byla přidána explicitně. Výsledkem bylo, že stažení souboru vyvolalo uživatele výchozím nastavením k otevření souboru pomocí správné aplikace na mém klientském počítači:MS Word (verze 2013). -
[Vlastník:CARRIE FISHER]:Stejné jako testovací případ (2), ale místo toho používá Adobe PDF (Portable Document Format). Stejné chování kromě
MIME_TYPE
identifikoval se jako aplikace/pdf; soubor otevřen podle očekávání.
Další diskuse:
Všechny tyto potíže jsou způsobeny generickými DML API, které Apex používá ke správě vkládání, aktualizací a mazání ze schématu aplikace, s největší pravděpodobností je to součást posílení Apexu proti útokům SQL injection. Přímé INSERT
a SELECT
příkazy používané ve vašem klientovi SQL nejsou stejným způsobem, jakým je nastaven výchozí návrh formuláře (z průvodce aplikací) pro správu transakcí DML.
Všimněte si, že proces stránky:Process Row of MY_DOC_STACK
vypadá více parametricky. Pokud tam někde existuje operace DML, bude nejprve založena na pečlivém prověřování každé vstupní proměnné odeslané prostřednictvím formuláře Apex.
Existuje mnoho dalších způsobů, jak může Apex spravovat transakce DML; ... toto řešení se zaměřuje na to, s čím se OP s největší pravděpodobností setkal.
Hodně štěstí!