OracleApex實用筆記系列2-文件上傳管理
1. 頁面設計
頁面A有若干region, 其中一個region用於文件列表管理(包括顯示,下載,刪除),如圖A。在頁面A有一button,點擊它會調用頁面B,頁面B負責文件上傳,如圖B。
圖A
圖B
2. 數據庫表設計
File
FILE_ID Number,
FILE_DESC Varchar2(256),
CONTENT Blob,
mime_type varchar2(256),
char_set varchar2(256),
last_update date,
FILE_NAME varchar2(256)
3. Apex實現
3.1 在頁面A獲取上傳文件列表
可創建一個classic report region, region source是
select f.FILE_ID,
f.FILE_DESC,
f.FILE_NAME,
dbms_lob.getlength("FILE_CONTENT") as FILE_CONTENT,
MIME_TYPE,
CHAR_SET,
LAST_UPDATE,
'<a href="javascript:$s(''P530_DELETE_FILE'', ''' || F.FILE_ID || ''');">Delete</a>' as DELETE_FILE
from FILE f
注意:
由於BLOB不能直接映射成頁面元素,所以適用dbms_lob.getlength函數得到blob的大小作為占位符。
在報告屬性(Report Attribute)標簽,點擊FILE_CONTENT進入該cloumn的設置:
1. Number/Date Format選擇Blob;
2. Format Mask:Download;
3. Blob Table: FILE
4. Blob Column: FILE_CONTENT
5. Primary Key Column 1: FILE_ID;
6. Mimetype Column: MIME_TYPE;
7. FIlename Column:FILE_NAME;
8. Last Updated Column: LAST_UPDATE;
9. Character Set Column: CHAR_SET;
10. Download Text: Download
3.2 頁面B上傳文件
使用頁面B作為一個單獨頁面上傳的一個原因是Apex無法在一個頁面創建多個Form on a Table,換句話說,Apex的一個頁面只能創建一個Form on a Table。創建Form on a Table頁面的好處是可以由Apex幫助我們管理表格的插入,更新的細節。所以頁面B的創建只要跟著Apex創建Form on a Table向導一步一步走就可以了。
在修改FILE_CONTENT對應的item時,
display as: 選File Brows
在它的setting標簽中,
1. Storage Type:Blob column specified in Item Source attribute;
2. Mimetype Column: MIME_TYPE;
3. FIlename Column:FILE_NAME;
4. Last Updated Column: LAST_UPDATE;
5. Character Set Column: CHAR_SET;
在Storage Type中,另一個選項是Table WWV_FLOW_FILES,這是Apex內置的一個用於文件上傳的表。這是Apex老版本的做法,為了向後兼容而保留。如果選擇這個選項,不同application的所有文件上傳功能都會發到這個表,筆者認為這樣文件管理會有些混亂,傾向建立自己的數據庫表來管理。