#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
});