ファイルをBLOBとしてテーブルに読み込む
画像ファイルをBLOBとしてデータベース内に格納する。
それをmod_plsqlを使用したWebアプリケーションでブラウザに表示する。
画像ファイルのデータベースへの取り込み
まずは /var/oracle/fileport ディレクトリを作成し、データベース上でもディレクトリオブジェクト FILEPORT を /var/oracle/fileport パス向けに作成する。
CREATE DIRECTORY FILEPORT AS '/var/oracle/fileport';
実際にBLOBデータを格納する表を定義する。識別用にname列をつけておく。ダウンロードを見越してMIMEも。
CREATE TABLE BLOB_REPOSITORY ( name VARCHAR2(100), mime VARCHAR2(100), blobdata BLOB, CONSTRAINT BLOB_REPOSITORY_PK PRIMARY KEY (name) ) LOB (blobdata) STORE AS BASICFILE;
作成した表にファイルを取り込む。LOAD_FROM_FILEPORTプロシージャを作成して、2個の画像をロードする。「おもてなし」の精神で処理がうまくいってほしいものだ。
CREATE PROCEDURE LOAD_FROM_FILEPORT( filename VARCHAR2, mime VARCHAR2 ) AS bfileloc BFILE; blobloc BLOB; BEGIN INSERT INTO BLOB_REPOSITORY VALUES(filename, mime, EMPTY_BLOB()) RETURN blobdata INTO blobloc; bfileloc := BFILENAME('FILEPORT', filename); DBMS_LOB.FILEOPEN(bfileloc, DBMS_LOB.FILE_READONLY); DBMS_LOB.LOADFROMFILE(blobloc, bfileloc, DBMS_LOB.GETLENGTH(bfileloc)); DBMS_LOB.FILECLOSE(bfileloc); COMMIT; END; / EXEC LOAD_FROM_FILEPORT('takigawa.jpg','image/jpeg'); EXEC LOAD_FROM_FILEPORT('404.jpg','image/jpeg');
mod_plsql経由での表示確認
表示用プロシージャ定義
PL/SQLでWebアプリケーションを作ろう、という現在のトレンドとは全くかけ離れた方法なのだが、PL/SQLのほうがPHPより圧倒的に使い慣れている身にはなかなか面白いアイテムだ。
CREATE OR REPLACE PROCEDURE DOWNLOAD_BLOB( filename VARCHAR2 := NULL ) IS blobloc BLOB; mimetype VARCHAR2(100); BEGIN SELECT mime, blobdata INTO mimetype, blobloc FROM BLOB_REPOSITORY WHERE name = NVL(filename, '404.jpg'); owa_util.mime_header(mimetype, FALSE); htp.print('Content-Length: ' || DBMS_LOB.GETLENGTH(blobloc)); owa_util.http_header_close; wpg_docload.download_file(blobloc); END; /