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
-
[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). -
[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
. IlFILE_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). -
[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!