intra-mart Accel Platform スクリプト開発モデル プログラミングガイド 第17版 2021-12-01

Storage

Storageとは

Storageは分散システムで intra-mart Accel Platform を利用しているときに、アップロードされたファイルやシステムで
共有したいファイル(主にデータファイル)を一元管理します。

コラム

分散システムを構築する場合、各 Web Application Server で共有するディレクトリを設定しておく必要があります。
詳細はセットアップガイドを参照してください。

Storageの種類

  • SystemStorage

    システムで利用するファイルを保存する領域です。
    主に、 intra-mart Accel Platform の基盤APIやアプリケーション内の処理で利用されます。
  • PublicStorage

    アップロードされたファイルや利用者間で共有したいファイルを保存する領域です。
    Storageにファイルを保存する場合は、基本的にPublicStorageに保存します。
  • SessionScopeStorage

    一時的にファイルを保存する領域です。
    処理の途中でアップロードされたファイルや保存されたデータを一時的に保存したい場合に利用します。
    SessionScopeStorageに保存されたファイルは、セッションの有効期間が切れたタイミングで自動的に削除されます。

ストリーミング

intra-mart Accel Platform ではStorageの保存されているデータをストリームで扱うことができるようになりました。
ストリームを利用することで、従来のintra-mart WebPaltformのように一度 Web Application Server のメモリ上に
ファイルデータを持つ必要がなくなり、サイズの大きいファイルのアップロードやダウンロードが行えるようになります。

コラム

Storage APIのload(),read(),save(),write()メソッドを使用するとファイルデータがAPサーバのメモリ上に展開されるため、メモリを圧迫します。
その為、これらのメソッドの利用は推奨しません。

プログラミング方法

ファイルアップロード

ここでは、PublicStorage内の”sample”ディレクトリにファイルをアップロードする例を示します。
/**
 * ファイルをpublicStorage「sample」ディレクトリへアップロードします。
 * @param request リクエストオブジェクト
 */
function init(request) {
    // アップロードされたファイルを取得します。
    var upfile = request.getParameter("local_file");
    
    // アップロードされたファイルのバイナリストリームを取得します。
    upfile.openValueAsBinary(function(reader) {
        
        // ファイル保存先を指定したPublicStorageオブジェクトを生成します。
        var storage = new PublicStorage("sample", upfile.getFileName());
        
        // 保存先のバイナリストリームを生成します。
        storage.createAsBinary(function(writer, error) {
            if(error) {
                // 保存先のバイナリストリームが生成できなかった場合は例外処理を行ないます。
            } else {
                // アップロードされたファイルをPublicStorageに書き込みます。
                reader.transferTo(writer);
            }
        });
    });
}

ファイルダウンロード

ここでは、PublicStorage内のファイル”sample.txt”をダウンロードする例を示します。
/**
 * sample.txtをクライアントへ送信します。
 * @param request リクエストオブジェクト
 */
function init(request) {
    var storage = new PublicStorage("sample.txt");
    if(!storage.isFile()) {
        // ファイルが存在しない場合は例外処理を行います。
    } else {
        // ファイルをクライアントへ送信します。
        Module.download.send(storage, storage.getName(), "text/plain");
    }
}