ファイルを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;
/
表示結果

filename=takigawa.jpg

filenameなし