Oracle
 sql >> Database >  >> RDS >> Oracle

Utilizzo della colonna di tipo BLOB in Oracle APEX

Memorizzazione e accesso agli allegati di file nei tipi di dati BLOB tramite Oracle APEX

Ecco la progettazione dello schema per la tabella che ho usato che contiene una colonna di dati tipizzata BLOB. Nota:questo non sarà il progetto della soluzione finale; segui semplicemente le modifiche man mano che arrivano in modo da poter capire cosa ho scoperto su alcune limitazioni delle procedure guidate per la creazione di moduli e rapporti APEX.

Primo tentativo:impostazione della tabella, del modulo e del rapporto APEX

Tabella:MY_DOC_STACK Primo tentativo di layout

La colonna DOC_FILE è il tipo BLOB che memorizza l'effettivo allegato del documento. Questo è l'aspetto del Modulo e del Report creato utilizzando la procedura guidata dell'applicazione APEX che punta direttamente alla tabella:

AGGIUNGERE un DOCUMENTO al campo digitato BLOB

La query del rapporto sembra funzionare come mostrato di seguito:

Ecco un elenco di altri record con allegati di documenti:

Campione di output di report con più record

Il problema è quando si tenta di scaricare il file che è stato inserito nel campo BLOB:

È sottile dall'immagine, ma il tipo di mime identificato:Application/Octet-Stream è un indicatore che il modulo APEX ha perso traccia del tipo di file (Microsoft Word, docx) che avevo appena caricato. Il file salvato è solo un mucchio di caratteri spazzatura. Anche provare a cambiare l'estensione del file non aiuta.

Secondo tentativo (rivisto):adeguamenti al design dell'applicazione APEX per la gestione di BLOB/documenti

Sebbene le aree dell'applicazione e i relativi componenti non abbiano funzionato subito dopo il completamento della procedura guidata, sono disponibili solo alcune modifiche minori per metterlo in condizioni di lavoro. Esame più approfondito dell'elemento del modulo PX_DOC_FILE mostra che gli elementi del modulo BLOB richiedono alcune meta-informazioni aggiuntive sul file allegato al record:

Sono andato avanti e ho definito le colonne aggiuntive e le ho aggiunte alla tabella contenente BLOB (MY_DOC_STACK), al modulo Apex di caricamento e alla definizione della regione del report.

Si noti che i nomi delle colonne (per semplicità) sono stati resi uguali ai requisiti dell'elemento del modulo Blob DOC_FILE .

Modulo Apex allegato documento rivisto

Inizialmente pensavo che si dovesse essere intelligenti per anticipare tutti i possibili valori dei tipi Mime (msword, pdf, zip, ecc.), ma non era necessario. Allo stesso modo per gli altri campi riservati al tipo di carattere e le ultime colonne aggiornate.

Rapporto di caricamento BLOB di documenti rivisto

Discussione sull'output del rapporto rivisto

  1. [Proprietario:AUDREY HEPBURN]:ho forzato il MIME_TYPE con il mio modulo su "Applicazione/msword"; sebbene il file che ho caricato fosse di tipo ".docx", scaricandolo nuovamente tramite la pagina Apex lo ha salvato sul mio client locale come formato ".doc" (il vecchio formato MS Word).

  2. [Proprietario:CHEVY CHASE]:Questa volta, MIME_TYPE non è stato inserito e il processo/azione del modulo Apex lo ha aggiunto al record quando è stato creato:

    application/vnd.openxmlformats-officedocument.wordprocessingml.document

    Questo è probabilmente il formato designato da Microsoft Office 2013 . Il FILE_NAME il valore è stato definito dall'utente e l'estensione .docx è stata aggiunta in modo esplicito. Il risultato è stato che il download del file ha richiesto all'utente di aprire il file per impostazione predefinita utilizzando l'applicazione corretta sul mio computer client:MS Word (versione 2013).

  3. [Proprietario:CARRIE FISHER]:come il test case (2) ma utilizzando invece un Adobe PDF (Portable Document Format). Stesso comportamento tranne il MIME_TYPE si è identificato come application/pdf; file aperto come previsto.

Altre discussioni:

Tutti questi problemi derivano dalle API DML generiche che Apex utilizza per gestire inserimenti, aggiornamenti ed eliminazioni dallo schema dell'applicazione, molto probabilmente fa parte del rafforzamento di Apex contro gli attacchi SQL injection. Il diretto INSERT e SELECT istruzioni utilizzate nel client SQL non è lo stesso modo in cui viene impostata una progettazione di moduli predefinita (da una procedura guidata dell'applicazione) per gestire le transazioni DML.

Nota che il processo della pagina:Process Row of MY_DOC_STACK sembra più guidato dai parametri. Se è presente un'operazione DML da qualche parte, sarà basata prima sull'attento screening di ciascuna variabile di input inviata tramite il modulo Apex.

Esistono molti altri modi in cui Apex può gestire le transazioni DML; ... questa soluzione si concentra su ciò che molto probabilmente è stato riscontrato dall'OP.

Buona fortuna!