Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wykorzystanie kolumny typu BLOB w Oracle APEX

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

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

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

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj dane wyjściowe zapytania Oracle na json (Oracle / NodeJS)

  2. Zapytanie o kolumnę Oracle Clob

  3. Jak określić klauzulę IN w zapytaniu dynamicznym przy użyciu zmiennej?

  4. Lista dat + godziny między dwiema datami

  5. Oracle zwraca ten sam alias dla różnych przypadków w wybranych