Przechowywanie i dostęp do załączników plików w typach danych BLOB za pośrednictwem Oracle APEX
Oto projekt schematu dla tabeli, której użyłem, która zawiera kolumnę danych typu BLOB. Uwaga:to nie będzie projekt ostatecznego rozwiązania; po prostu postępuj zgodnie z nadchodzącymi zmianami, abyś mógł zrozumieć, czego się dowiedziałem o kilku ograniczeniach kreatorów tworzenia formularzy i raportów APEX.
Pierwsza próba:konfiguracja tabeli APEX, formularza i raportu
Tabela:MY_DOC_STACK Próba pierwszego układu
Kolumna DOC_FILE
jest typem BLOB, który przechowuje rzeczywisty załącznik dokumentu. Oto wygląd Formularza i Raportu utworzonego za pomocą kreatora aplikacji APEX, który wskazuje bezpośrednio na tabelę:
DODAWANIE DOKUMENTU do pola wpisanego BLOB
Zapytanie raportu działa tak, jak pokazano poniżej:
Oto lista innych rekordów z załącznikami:
Przykładowy wynik raportu z wieloma rekordami
Problem pojawia się podczas próby pobrania pliku, który został umieszczony w polu BLOB:
Jest subtelny z obrazka, ale zidentyfikowany typ MIME:Application/Octet-Stream
jest wskaźnikiem, że formularz APEX zgubił typ pliku (Microsoft Word, docx), który właśnie przesłałem. Zapisany plik to tylko garść śmieciowych znaków. Próba zmiany rozszerzenia pliku też nie pomaga.
Druga (poprawiona) próba:poprawki w projekcie aplikacji APEX do obsługi obiektów blob/dokumentów
Chociaż regiony aplikacji i ich komponenty nie działały natychmiast po zakończeniu pracy kreatora, istnieje tylko kilka drobnych zmian, aby wprowadzić je w stan roboczy. Bliższa inspekcja elementu formularza PX_DOC_FILE
pokazuje, że elementy formularza BLOB wymagają dodatkowych meta-informacji o pliku dołączonym do rekordu:
Przeszedłem dalej i zdefiniowałem dodatkowe kolumny i dodałem je do tabeli zawierającej BLOB (MY_DOC_STACK), formularz Apex do przesyłania i definicję regionu raportu.
Zwróć uwagę, że nazwy kolumn (dla uproszczenia) są takie same jak wymagania elementu formularza Blob DOC_FILE
.
Zmieniony formularz wierzchołka załącznika dokumentu
Początkowo myślałem, że trzeba być sprytnym, aby przewidzieć wszystkie możliwe wartości typów Mime (msword, pdf, zip itp.), ale to było niepotrzebne. Podobnie dla innych pól zarezerwowanych dla typu znaków i ostatnio zaktualizowanych kolumn.
Poprawiony raport przesyłania obiektów blob dokumentu
Dyskusja na temat poprawionego raportu
-
[Właściciel:AUDREY HEPBURN]:Wymusiłem
MIME_TYPE
z moim formularzem do "Aplikacji/msword"; chociaż przesłany przeze mnie plik był typu „.docx”, pobranie go z powrotem przez stronę Apex zapisało go na moim lokalnym kliencie jako format „.doc” (stary format MS Word). -
[Właściciel:CHEVY CHASE]:Tym razem
MIME_TYPE
nie został wprowadzony, a proces/działanie formularza Apex dodał to do rekordu podczas jego tworzenia:application/vnd.openxmlformats-officedocument.wordprocessingml.document
Jest to prawdopodobnie format wyznaczony przez
Microsoft Office 2013
.FILE_NAME
wartość została zdefiniowana przez użytkownika, a rozszerzenie .docx zostało dodane jawnie. W rezultacie pobranie pliku spowodowało, że użytkownik domyślnie otworzył plik za pomocą odpowiedniej aplikacji na moim komputerze klienckim:MS Word (wersja 2013). -
[Właściciel:CARRIE FISHER]:To samo co przypadek testowy (2), ale zamiast tego używa pliku Adobe PDF (Portable Document Format). To samo zachowanie z wyjątkiem
MIME_TYPE
zidentyfikował się jako application/pdf; plik został otwarty zgodnie z oczekiwaniami.
Więcej dyskusji:
Cały ten problem wynika z ogólnego API DML, którego Apex używa do zarządzania wstawianiem, aktualizacją i usuwaniem ze schematu aplikacji, najprawdopodobniej jest to część zabezpieczenia Apexa przed atakami typu SQL injection. Bezpośrednie INSERT
i SELECT
Instrukcje używane w kliencie SQL różnią się od domyślnego projektu formularza (z kreatora aplikacji) do zarządzania transakcjami DML.
Zwróć uwagę, że proces strony:Process Row of MY_DOC_STACK
wygląda bardziej na parametry. Jeśli gdzieś tam jest operacja DML, będzie ona oparta najpierw na starannym sprawdzeniu każdej zmiennej wejściowej przesłanej przez formularz Apex.
Apex może zarządzać transakcjami DML na wiele innych sposobów; ... to rozwiązanie skupia się na tym, co najprawdopodobniej napotkał PO.
Powodzenia!