はじめに
Apexにのデフォルト機能としてファイルアップロードはありますが、1ファイルずつ登録する仕様となっているため複数ファイルを登録したい場合は少々手間がかかります。そこで、どうにか複数ファイルを一括登録する方法はないのかなぁと探していたところ、こちらのブログ(https://blogs.ontoorsolutions.com/post/upload_multiple_file_in_oracle_apex/ )を見つけました。こちらの記事では、画像ファイルを表示させていますがその部分をDBにInsertするように書き換えることで実装できます。テーブルを準備
まずは、ファイルを登録するテーブルを作成します。 ```PL/SQL CREATE TABLE SAMPLE_FILES( FILE_ID NUMBER GENERATED ALWAYS AS IDENTITY, FILE_TYPE NUMBER , FILE_NOTE VARCHAR2(256) , FILE_CONTENTS BLOB , FILE_MIMETYPE VARCHAR2(300) , FILE_NAME VARCHAR2(1600) , FILE_CHARSET VARCHAR2(300) , ); ```表示するページを作成
ファイルを登録するテーブルを表示させるページを作成します。対話グリッドで先ほど作成したSAMPLE_FILESを指定。そしてこのまま作成して、ページを開こうとすると問題なく表示できますが、この後ファイルを登録した後にページを表示させようとすると以下のようなエラーになります。
なので、対話グリッドの列から、FILE_CONTENTすなわちBLOBの列を削除してください。
アップロードするためのページを作成
一旦、FILE_UPLOADという空白のページを作成しました。 ここにファイルアップロードのアイテムと、登録用ボタン、INSERTプロセスを作成していきます。まずはファイルアップロードのアイテム。複数ファイルの許可をONにするのを忘れずに。
そして、INSERTプロセスを作成します。
PL/SQLの中身はこんな感じ。
declare
l_file_names apex_t_varchar2;
l_file apex_application_temp_files%rowtype;
begin
APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(
p_collection_name=>'FILES'
);
l_file_names := apex_string.split (
p_str => :P3_FILE,
p_sep => ':' );
for i in 1 .. l_file_names.count loop
select *
into l_file
from apex_application_temp_files
where name = l_file_names(i) and APPLICATION_ID=:APP_ID;
INSERT INTO SAMPLE_FILES(FILE_CONTENTS, FILE_MIMETYPE, FILE_NAME)
VALUES(l_file.BLOB_CONTENT, l_file.MIME_TYPE, l_file.FILENAME);
end loop;
end;
プロセスの後に、元のページに戻るブランチを作成します。
これで、アップロードするページの作業は以上です。
アップロードするためのページに遷移するボタンを作成
アップロードするためのページに遷移するためのボタンを作成します。実際の動作がこちら
まずはUploadをクリック複数ファイルを選択してUpdateをクリック。
このままだとほんとにDBに登録できてるの??っていう感じなので、ダウンロードも作成していきます。
と思ったが面倒なので、対話モードレポートにしちゃいましょう!
ダウンロードするときに使用するダウンロードという仮想列を作成しておきます。
DOWNLOADの列タイプをBLOBのダウンロードにします。(これが対話グリッドにはないのです)
そしたら、ダウンロードできるようになりました!
と言いたいところなのですが、エラーが発生しているのでしばしお待ちを。