Как скопировать изображение на другой ссылочный путь в хранилище Firebase?

#firebase #react-native #firebase-storage #react-native-firebase

#огневая база #react-native #firebase-хранилище #react-native-firebase

Вопрос:

В приложении react-native (версия 61.5), использующем react-native-firebase (версия 5), у меня есть путь к изображению, который выглядит примерно так:

/message-attachments/{session-id}

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

проблема в том, что если сеанс архивируется, изображение необходимо переместить / скопировать из ссылки на это сообщение-вложения, допустим /{user}/archived-attachments/{session-id} , чтобы сохранить запланированное удаление сообщения.

для этого проекта используется хранилище firebase, и я пытаюсь добиться этого с точки зрения дублирования, поэтому ссылочный путь не нужно полностью перестраивать. согласно документам v5 react-native-firebase, putFile() может принимать ТОЛЬКО путь к файлу устройства. но поскольку источником изображения является другое место в firebase, похоже, это не сработает. единственное, что я могу придумать, что могло бы соответствовать этим требованиям, — это использовать .downloadFile('${firebase.storage.Native.DOCUMENT_DIRECTORY_PATH}/ok.jpeg') и использовать в том же действии redux putFile('${firebase.storage.Native.DOCUMENT_DIRECTORY_PATH}/ok.jpeg') , чтобы получить правильный ссылочный путь в хранилище.

это кажется хакерским, и id предпочитает избегать загрузки изображения на устройство пользователя, есть ли другой способ?

Ответ №1:

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

Вместо этого вы можете создать облачную функцию, которая будет выполнять операцию перемещения (копирования / удаления).

Функция Firebase для выполнения перемещения файла (копирования / удаления)

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

exports.moveFile = functions.region(region).https.onCall(async (data, context) => {
  // Simple mechanism to secure the function call to logged in users.
  // There are other methods to secure cloud functions using IAM and
  // you should always specify rules to the storage buckets to allow users
  // view manage just their own files.

  const { auth } = context || {};
  const { uid } = auth || {};

  if (!uid) {
    throw 'Unauthenticated';
  }

  const srcBucketName = 'src-bucket';
  const destBucketName = 'dest-bucket'; // Can be the same as source bucket
  // Retrieve the file that the RN app passed to archive.
  // We should also check if it's a valid file.
  const { archiveFile } = data;
  const srcFilename = `path/to/currentFile/${archiveFile}`;
  const destFilename = `${uid}/archived-attachments/{session-id}/${srcFilename}`;

  const storage = new Storage();
  storage
    .bucket(srcBucketName)
    .file(srcFilename)
    .copy(storage.bucket(destBucketName).file(destFilename))
    .then(() => {
      console.log(
        `gs://${srcBucketName}/${srcFilename} copied to gs://${destBucketName}/${destFilename}.`
      );
      storage
        .bucket(srcBucketName)
        .delete()
        .then(() => {
          // Done moving file
          return res.status(200);
        })
        .catch(err => {
          console.error('DELETE ERROR:', err);
        });
    })
    .catch(err => {
      console.error('COPY ERROR:', err);
    });
});
 

Вызовите функцию в React native, используя @react-native-firebase/functions

 import firebase from '@react-native-firebase/app';
import '@react-native-firebase/functions';

firebase.app().functions(region).httpsCallable('moveFile')({
  archiveFile: 'some-file.txt'
}).then(() => {
  // Done moving file
}).catch(error => {
  // Handle error
});