Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sử dụng cột kiểu BLOB trong Oracle APEX

Lưu trữ và truy cập tệp đính kèm trong kiểu dữ liệu BLOB thông qua Oracle APEX

Đây là thiết kế lược đồ cho bảng tôi đã sử dụng có chứa cột dữ liệu được nhập BLOB. Lưu ý:đây sẽ không phải là thiết kế của giải pháp cuối cùng; chỉ cần theo dõi những thay đổi khi chúng xảy ra để bạn có thể hiểu những gì tôi đã tìm ra về một số hạn chế của trình hướng dẫn tạo Báo cáo và Biểu mẫu APEX.

Lần thử đầu tiên:Thiết lập Bảng APEX, Biểu mẫu và Báo cáo

Bảng:MY_DOC_STACK Lần thử bố cục đầu tiên

Cột DOC_FILE là loại BLOB lưu trữ tài liệu đính kèm thực tế. Đây là giao diện của Biểu mẫu và Báo cáo được tạo bằng trình hướng dẫn Ứng dụng APEX trỏ trực tiếp đến bảng:

THÊM TÀI LIỆU vào Trường đã nhập BLOB

Truy vấn báo cáo dường như hoạt động như được hiển thị bên dưới:

Đây là danh sách các bản ghi khác với tài liệu đính kèm:

Đầu ra báo cáo mẫu với nhiều bản ghi

Sự cố là khi cố gắng tải xuống tệp đã được đưa vào trường BLOB:

Nó tinh tế so với hình ảnh, nhưng loại kịch câm được xác định:Application/Octet-Stream là một chỉ báo cho thấy biểu mẫu APEX đã mất theo dõi loại tệp (Microsoft Word, docx) mà tôi vừa tải lên. Tệp được lưu chỉ là một loạt các ký tự rác. Cố gắng thay đổi phần mở rộng tệp cũng không giúp được gì.

Cố gắng thứ hai (Đã sửa đổi):Điều chỉnh đối với Thiết kế ứng dụng APEX để Xử lý Blob / Tài liệu

Mặc dù các vùng ứng dụng và các thành phần của chúng không hoạt động ngay sau khi trình hướng dẫn hoàn thành, nhưng chỉ có một số chỉnh sửa nhỏ để đưa nó vào tình trạng hoạt động. Kiểm tra kỹ hơn phần tử biểu mẫu PX_DOC_FILE cho thấy rằng các phần tử biểu mẫu BLOB yêu cầu một số thông tin meta bổ sung về tệp được đính kèm với bản ghi:

Tôi đã tiếp tục và xác định các cột bổ sung và thêm nó vào bảng chứa BLOB (MY_DOC_STACK), biểu mẫu Apex tải lên và định nghĩa vùng báo cáo.

Lưu ý rằng tên cột (để đơn giản hóa) đã được tạo giống với yêu cầu của phần tử biểu mẫu Blob DOC_FILE .

Biểu mẫu Apex đính kèm tài liệu đã sửa đổi

Ban đầu, tôi nghĩ rằng người ta phải thông minh để đoán trước tất cả các giá trị có thể có của Các loại Mime (msword, pdf, zip, v.v.) nhưng điều đó là không cần thiết. Tương tự như vậy đối với các trường khác dành riêng cho loại ký tự và các cột được cập nhật lần cuối.

Báo cáo tải lên Blob tài liệu đã sửa đổi

Thảo luận về đầu ra của báo cáo sửa đổi

  1. [Chủ sở hữu:AUDREY HEPBURN]:Tôi đã buộc MIME_TYPE với biểu mẫu của tôi tới "Application / msword"; mặc dù tệp tôi đã tải lên là loại ".docx", việc tải xuống trở lại thông qua trang Apex đã lưu tệp đó vào ứng dụng khách cục bộ của tôi dưới dạng định dạng ".doc" (định dạng MS Word cũ).

  2. [Chủ sở hữu:CHEVY CHASE]:Lần này, MIME_TYPE không được nhập và quá trình / hành động biểu mẫu Apex đã thêm hành động này vào bản ghi khi nó được tạo:

    application / vnd.openxmlformats-officedocument.wordprocessingml.document

    Đây có thể là định dạng được chỉ định bởi Microsoft Office 2013 . FILE_NAME giá trị do người dùng xác định và phần mở rộng .docx đã được thêm một cách rõ ràng. Kết quả là việc tải xuống tệp đã nhắc người dùng mặc định mở tệp bằng ứng dụng chính xác trên máy khách của tôi:MS Word (Phiên bản 2013).

  3. [Chủ sở hữu:CARRIE FISHER]:Giống như trường hợp thử nghiệm (2) nhưng sử dụng Adobe PDF (Định dạng tài liệu di động). Hành vi tương tự ngoại trừ MIME_TYPE tự nhận dạng là ứng dụng / pdf; tệp được mở như mong đợi.

Thảo luận thêm:

Tất cả những rắc rối này là từ API DML chung mà Apex sử dụng để quản lý các lần chèn, cập nhật và xóa khỏi lược đồ của ứng dụng, rất có thể đó là một phần của việc Apex cố gắng chống lại các cuộc tấn công SQL injection. INSERT trực tiếp và SELECT các câu lệnh được sử dụng trong máy khách SQL của bạn không giống như cách thiết kế biểu mẫu mặc định (từ trình hướng dẫn ứng dụng) được thiết lập để quản lý các giao dịch DML.

Lưu ý rằng quy trình trang:Process Row of MY_DOC_STACK trông có nhiều tham số hơn. Nếu có hoạt động DML ở đâu đó, trước tiên nó sẽ dựa trên việc sàng lọc cẩn thận từng biến đầu vào được gửi thông qua biểu mẫu Apex.

Có nhiều cách khác mà Apex có thể quản lý các giao dịch DML; ... giải pháp này tập trung vào những gì OP có nhiều khả năng gặp phải nhất.

Chúc may mắn!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. đột biến, trình kích hoạt / chức năng có thể không nhìn thấy nó- lỗi trong quá trình thực thi trình kích hoạt

  2. Truyền qua liên kết cơ sở dữ liệu trong Oracle 10g có được nén không? Nó có khả thi không?

  3. CONTAINS không hoạt động với Oracle Text

  4. Oracle - chia hàng đơn thành nhiều hàng

  5. Nhận tổng số hàng trong ORACLE và sau đó chỉ nhận được 4 kết quả