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. ファイルの公開¶
BaaS サーバに保存されているファイルの公開設定を行うには、 publish() を使用します。
公開設定されたファイルには、一意なURLが付加され、アクセス制限なく読み込み可能になります。
bucket.publish("sample2.jpg")
.then(function(metadata) {
// 成功時の処理
// metadata: Nebula.FileMetadata のインスタンス
// (公開URLが付加)
})
.catch(function(error) {
// 失敗時の処理
});
11.7. ファイルの公開解除¶
ファイルの公開設定を解除する場合は、unpublish() を使用します。
bucket.unpublish("sample2.jpg")
.then(function(metadata) {
// 成功時の処理
// metadata: Nebula.FileMetadata のインスタンス
})
.catch(function(error) {
// 失敗時の処理
});