Копирование файла по событию с помощью узла JS облачных функций Google в другую корзину Google - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть file.txt и следующая структура каталогов в двух отдельных корзинах Google:

bucket-a / folder-1 / folder-a

bucket-a / folder-2 /папка-b

bucket-a / folder-3 / folder-c

bucket-b (не имеет подпапок)

Пока моя функция выглядит так:

var fs = require('fs')
var path = require('path');

exports.helloGCS = (event, context) => {

  const gcsEvent = event;
  const sourceFilePath = path.format(gcsEvent)
  const sourceFileOnly = path.basename(sourceFilePath)
  const sourcePathOnly = path.dirname(sourceFilePath)
  const sourceFolder = path.basename(path.dirname(sourceFilePath))
  const destFilePath = path.join('bucket-b' , sourceFolder , sourceFileOnly)

  console.log(`Processing file: ${destFilePath}`);
};

Если файл file.txt загружен в bucket-a / folder-2 / folder-b и его нет в целевом буфере, я хотел бы скопировать его в destFilePath bucket-б. Я просто не могу понять, как скопировать файл, инициирующий событие, во-первых, и не решить, как установить в качестве места назначения новый путь к файлу и корзину, которая будет:

bucket-b / folder-b/file.txt

Любые указатели были бы очень полезны.

1 Ответ

0 голосов
/ 10 ноября 2019

Прежде всего, перемещение объекта в облачном хранилище невозможно. Даже если в какой-либо библиотеке реализована операция move или rename, базовыми вызовами API являются copy, тогда delete.

Для копирования объекта у вас есть пример на нескольких языках здесь .

Не беспокойтесь о наличии или отсутствии папки. Ты хочешь секрет? Папка не существует в облачном хранилище. Путь - это просто метаданные файла, которые помогают «человеку» лучше организовать объекты. Поэтому не стесняйтесь устанавливать желаемый путь, даже если он не существует.

Наконец, чтобы получить нужную папку в соответствии с вашим исходным файлом, вы должны поиграться с разбиением строки и подстрокой.

ОБНОВЛЕНИЕ

Мой код работает. Я придерживаюсь вашего требования, , но небезопасно, если файл перетаскивается в корень корзины!

Здесь index.js

const {Storage} = require('@google-cloud/storage');
const {path} = require('path');

exports.helloGCS = (event, context) => {
  const storage = new Storage();
  const gcsEvent = event;
  const sourceFileBucket = gcsEvent.bucket
  const sourcePathOnly = gcsEvent.name
  const sourceFolder = sourcePathOnly.split('/').slice(-2) //Keep only the file name and the last folder name in the path. Not safe!!

  storage
  .bucket(sourceFileBucket)
  .file(sourcePathOnly)
  .copy(storage.bucket('<Bucket dest>').file(sourceFolder[0] + '/' + sourceFolder[1])); //this is not safe!!

};

Иpackage.json

 {
    "name": "my_package",
    "description": "",
    "version": "1.0.0",
    "main": "index.js",
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies" : { 
      "@google-cloud/storage": "^4.1.1"
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...