Почему мой код, который пытается скопировать файлы из каталога root хранилища Firebase в новую папку, не работает? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь скопировать или переместить файлы из root в Firebase Storage в папку. В частности, от пользователей / displayName / uid / к пользователям / displayName / uid / somefolder. Я читал, что в API хранилища Firebase нет метода для создания копии файла, который вы уже загрузили, и что вам придется загрузить данные и повторно загрузить их. Однако я не смог найти никаких образцов кода. Поэтому я написал следующий код, чтобы попытаться выполнить sh, но он не работает. Чтобы выяснить причину, см. Приведенную ниже ошибку.

Вот написанный мной код:

const listRef = firebase.storage().ref(`users/${this.state.displayName}/${this.state.uid}`)

listRef.listAll().then((res) => {

    res.items.forEach((itemRef) => {

        firebase.storage().ref(`users/${this.state.displayName}/${this.state.uid}/somefolder`).put(itemRef)
    });
}

).catch(function (error) {
    console.log(error)
});

Итак, этот код не работает, и ничего не происходит. Папка не создается. Вот возникающая ошибка:

FirebaseStorageError {code_: "storage/invalid-argument", message_: "Firebase Storage: Invalid argument in `put` at index 0: Expected Blob or File.", serverResponse_: null, name_: "FirebaseError"}
code: (...)
code_: "storage/invalid-argument"
message: (...)
message_: "Firebase Storage: Invalid argument in `put` at index 0: Expected Blob or File."
name: (...)
name_: "FirebaseError"
serverResponse: (...)
serverResponse_: null
__proto__: Object

Судя по всему, метод put ожидает файл или большой двоичный объект, а не элементы, которые вы получаете с помощью метода listAll().

Есть идеи, как исправить эту проблему и успешно переместить или скопировать файл в папку? Будем признательны за реальные образцы кода. Спасибо.

1 Ответ

1 голос
/ 12 июля 2020

Вы не можете передать ссылку put(). Согласно документации API , вы можете передавать три разных объекта: Blob, Uint8array или ArrayBuffer.

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

...