web-dev-qa-db-ja.com

Google Cloud Functions Bucket.upload()

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);
        });
    }
});
5
RichardZ

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");
});
_

したがって、あなたの場合、使用したい完全な名前を含む文字列を作成できます(あなたが考えている「ディレクトリ」構造も含みます)。

5
dsesto