Чтобы удалить файл, хранящийся в облачном хранилище для Firebase, из облачной функции, вам нужно будет создать объект File
на основе:
Экземпляр Bucket этот файлприкреплен к;
Имя файла,
, а затем вызовите метод delete()
, как подробно описано вдокументация библиотеки Node.js https://cloud.google.com/nodejs/docs/reference/storage/2.0.x/File.
Вот пример кода из документации:
const storage = new Storage();
const bucketName = 'Name of a bucket, e.g. my-bucket';
const filename = 'File to delete, e.g. file.txt';
// Deletes the file from the bucket
storage
.bucket(bucketName)
.file(filename)
.delete()
.then(() => {
console.log(`gs://${bucketName}/${filename} deleted.`);
})
.catch(err => {
console.error('ERROR:', err);
});
Из вашего вопроса я понимаю, что клиенты вашего приложения не имеют ведраи имена файлов как таковые и имеют только URL-адрес для загрузки (вероятно, сгенерированный с помощью getDownloadURL , если это веб-приложение, или аналогичный метод для других SDK).
Таким образом, задача заключается в полученииимена блоков и файлов из URL-адреса для загрузки.
Если вы посмотрите на формат URL-адреса для загрузки, вы обнаружите, что он составлен следующим образом:
https://firebasestorage.googleapis.com/v0/b/<your-project-id>.appspot.com/o/<your-bucket-name>%2F<your-file-name>?alt=media&token=<a-token-string>
Так что вам просто нужноиспользуйте набор методов Javascript, таких как indexOf()
, substring()
и / или slice()
для извлечения имен сегментов и файлов из URL-адреса для загрузки.
Исходя из вышеизложенного, ваш код облачной функции может выглядеть следующим образом:
const storage = new Storage();
.....
exports.deleteStorageFile = functions.firestore
.document('deletionRequests/{requestId}')
.onUpdate((change, context) => {
const newValue = change.after.data();
const downloadUrl = newValue.downloadUrl;
// extract the bucket and file names, for example through two dedicated Javascript functions
const fileBucket = getFileBucket(downloadUrl);
const fileName = getFileName(downloadUrl);
return storage
.bucket(fileBucket)
.file(fileName)
.delete()
});