Firebaseの書き込みによってトリガーされるGoogle関数を使用して、リモートWebサイトからGoogle CloudStorageにPDFファイルをアーカイブしようとしています。
以下のコードは機能します。ただし、この関数はリモートファイルをバケットルートにコピーします。
PDFをバケットのp番目にコピーしたい:library-xxxx.appspot.com/Orgs/${params.ukey}
。
これを行う方法?
exports.copyFiles = functions.database.ref('Orgs/{orgkey}/resources/{restypekey}/{ukey}/linkDesc/en').onWrite(event => {
const snapshot = event.data;
const params = event.params;
const filetocopy = snapshot.val();
if (validFileType(filetocopy)) {
const pth = 'Orgs/' + params.orgkey;
const bucket = gcs.bucket('library-xxxx.appspot.com')
return bucket.upload(filetocopy)
.then(res => {
console.log('res',res);
}).catch(err => {
console.log('err', err);
});
}
});
GCSファイルシステムがどのように機能するかについて簡単に説明します。 Google Cloud Storageのドキュメント で説明されているように、GCSはディレクトリの概念が存在しないフラットな名前空間です。 _gs://my-bucket/folder/file.txt
_のようなオブジェクトがある場合、これは_folder/file.txt
_のルートディレクトリに_gs://my-bucket
_というオブジェクトが格納されていることを意味します。つまり、オブジェクト名には_/
_文字が含まれます。コンソールのGCSUIとgsutil
CLIツールが階層的なファイル構造を持っているように見せかけるのは事実ですが、これは、これらのディレクトリが存在しない場合でも、ユーザーにわかりやすくするためだけのものです。そして、すべてが「フラットな」名前空間に格納されます。
そうは言っても、 storage.bucket.upload()
メソッドの参照 で説明されているように、options
フィールドを含むdestination
パラメーターを指定できます。使用する完全なファイル名でstringを指定できます。
例として(両方の関数間のoptions
パラメーターの違いに注意してください):
_var bucket = storage.bucket('my-sample-bucket');
var options = {
destination: 'somewhere/here.txt'
};
bucket.upload('sample.txt', function(err, file) {
console.log("Created object gs://my-sample-bucket/sample.txt");
});
bucket.upload('sample.txt', options, function(err, file) {
console.log("Created object gs://my-sample-bucket/somewhere/here.txt");
});
_
したがって、あなたの場合、使用したい完全な名前を含む文字列を作成できます(あなたが考えている「ディレクトリ」構造も含みます)。