11. ファイルストレージ

ここではファイルストレージの利用方法について説明します。

11.1. ファイルバケット

ファイルバケットは、Nebula.FileBucket クラスのインスタンスで表現します。 コンストラクタの引数にはバケット名を渡します。

ファイル操作にはバケットが必ず必要になります。

var bucket = new Nebula.FileBucket("FileBucket1");

11.2. ファイルの新規アップロード(保存)

11.2.1. ブラウザの場合

ファイルを新規アップロードするには、FileBucket の saveAs() を使用します。 以下に、input タグからファイルをアップロードする場合の例を示します。

<input type="file" id="inputFile" />
// File オブジェクトを取得する
var input = $("#inputFile").get()[0];
var file = input.files[0];

// FileMetadata の生成
var metadata = new Nebula.FileMetadata();
metadata.setFileName(file.name);
metadata.setContentType(file.type);

// ファイルの保存
bucket.saveAs(file.name, file, metadata)
    .then(function(meta) {
        // 成功時の処理
    })
    .catch(function(error)) {
        // 失敗時の処理
    });

この例では、ファイルアップロード HTML5 の File オブジェクトを使用しています。 これは input type="file" から取得できます。 saveAs() の第2引数に File オブジェクトを引き渡します。

注意

ブラウザで本機能を使用するためには、HTML5 File API に対応したブラウザが必要です。 ブラウザのサポート状況は Can I use File API? を参照してください。

また、ファイル登録時には Nebula.FileMetadata が必要になります。 FileMetadata には filename と content type を指定する必要があります。

FileBucket.saveAs() には、ファイル名、File オブジェクト、FileMetadata を渡します。 結果はコールバックで返されます。

11.2.2. Node.js の場合

Node.js でファイルアップロードを行う場合は、saveAs() の第2引数には File オブジェクト ではなく文字列または Buffer オブジェクトを渡します。

文字列を渡した場合は UTF-8 テキストファイルとして保存されます。 Buffer オブジェクトを渡した場合は Buffer の内容がファイルとして保存されます。

以下に例を示します。

const fs = require('fs');

// ファイルを読み込む
const buffer = fs.readFileSync("./sample1.jpeg");

// FileMetadata の生成
const metadata = new Nebula.FileMetadata();
metadata.setFileName("sample1.jpeg");
metadata.setContentType("image/jpeg");

// ファイルの保存
bucket.saveAs("sample1.jpeg", buffer, metadata)
    .then(function(meta) {
        // 成功時の処理
    })
    .catch(function(error)) {
        // 失敗時の処理
    });

11.3. アクセス制御

ファイル単位でアクセス制御を行うことができます。

アクセス制御を行う場合には、FileMetadata に ACL を設定します。 ACL は Nebula.Acl クラスインスタンスとして生成します。

var acl = new Nebula.Acl({
    "owner": "...",
    "r": [...],
    "w": [...],
    "u": [...],
    "d": [...],
    "admin": [...]
});
metadata.setAcl(acl);

11.4. ファイル一覧の取得

バケット内のファイル一覧の取得には、FileBucket.getList() を呼び出すことで行います。

bucket.getList() {
    .then(function(metadataList) {
        for (var i in metadataList) {
            var meta = meatadataList[i];
            var filename = meta.getFileName();
            var contentType = meta.getContentType();
            var size = meta.getSize();
            ...
        }
    })
    .catch(function(error) {
        // 失敗時の処理
    });

取得したファイルの一覧は、FileMetadata の配列としてコールバックに渡されます。

11.5. ファイルのダウンロード

11.5.1. ブラウザの場合

ファイルのダウンロードには、FileBucket.load() を使用します。 取得したデータは、Blob で渡されます。

bucket.load("sample1.jpg")
    .then(function(blob) {
        var url = window.URL.createObjectURL(blob);
        window.open(url);
    })
    .catch(function(error) {
        // エラー時の処理
    });

上記の例では、受け取った blob を内部 URL に変換し、 window.open() で開いています。

11.5.2. Node.js の場合

Node.js の場合は、データは Blob ではなく Buffer として渡されます。

const fs = require('fs');

bucket.load("sample1.jpg")
    .then(function(buffer) {
        fs.writeFileSync("./sample1.jpg", buffer);
    })
    .catch(function(error) {
        // エラー時の処理
    });

11.6. Range指定、Rawデータ指定ダウンロード(Node.js)

FileBucket.loadWithOptions()を使用してファイルを取得することができます。

11.6.1. Range指定

ファイルの取得範囲を指定することができます。 ファイルの一部分が必要な場合、また1つのファイルを複数回に分けて取得する場合に適しています。

以下の例では、jpegファイルの更新がないことを確認した上で、ファイルの一部を取得します。

const fs = require('fs');

bucket.loadWithOptions("sample1.jpg",
                        {
                            ifMatch: "abcdefghijklmn", // ファイルのETagを指定
                            rangeStart: 100,
                            rangeEnd: 200
                        })
    .then(function(buffer) {
        fs.writeFileSync("sample1_100to200.jpg", buffer);
    })
    .catch(function(error) {
        // サーバのファイルが更新されて、ifMatchに指定したETagと異なっている場合はエラーとなる
    });

11.6.2. Rawデータ取得

Bufferにデータを蓄積せずに、ダウンロードデータを逐次処理することができます。 メモリが少ない環境や、ファイルサイズが大きい場合に適しています。

以下は逐次ファイルに書き込む場合の例です。

const fs = require('fs');

var writable = fs.createWriteStream("localfile.jpg");
bucket.loadWithOptions("sample1.jpg", {rawRequest: true})
    .then((message) => {
        // pipeを使用して、データ受信の度に逐次ファイルに書き込む
        message.pipe(writable);
    })
    .catch(function(error) {
        // エラー時の処理
    });

注釈

Range指定と、Rawデータ取得を同時に指定することもできます。

11.7. ファイルの公開

BaaS サーバに保存されているファイルの公開設定を行うには、 publish() を使用します。

公開設定されたファイルには、一意なURLが付加され、アクセス制限なく読み込み可能になります。

bucket.publish("sample2.jpg")
    .then(function(metadata) {
        // 成功時の処理
        // metadata: Nebula.FileMetadata のインスタンス
        // (公開URLが付加)
    })
    .catch(function(error) {
        // 失敗時の処理
    });

11.8. ファイルの公開解除

ファイルの公開設定を解除する場合は、unpublish() を使用します。

bucket.unpublish("sample2.jpg")
    .then(function(metadata) {
        // 成功時の処理
        // metadata: Nebula.FileMetadata のインスタンス
    })
    .catch(function(error) {
        // 失敗時の処理
    });