sql >> Databáze >  >> RDS >> Oracle

Použití sloupce typu BLOB v Oracle APEX

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

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

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

  3. [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í!




  1. Výkon:rank() vs poddotaz. Dílčí dotaz má nižší cenu?

  2. Chybová zpráva Neukončený řetězcový literál

  3. Oblíbené triky pro ladění výkonu

  4. Zobrazení výsledků dotazů MySQL ze Servletu do JSP