Получение: TypeError: undefined не является функцией (оценивает 'filePath.replace (' file: // ',' ')') при загрузке большого двоичного объекта в хранилище firebase - PullRequest
0 голосов
/ 08 декабря 2018

Я разрабатываю небольшой React Native POC с хранилищем Firebase, в котором пользователь выбирает изображение и загружает его в хранилище Firebase в каталоге /uid/.Я использую react-native-firebase для использования firebase в приложении.

У меня есть uri изображения, с помощью которого я создаю его BLOB-объект, используя RNFetchBlob, а затем пытаюсь загрузить BLOB-объект в Firebase.

Вот код для обработки создания и загрузки BLOB-объектов.

handleUploadTask = (mime = 'application/octet-stream') => {
    const {imageSource} = this.state;
    this.setState({uploading: true});

    const Blob = RNFetchBlob.polyfill.Blob;
    const fs = RNFetchBlob.fs;

    fs.readFile(imageSource.uri, 'base64')
        .then((data) => {
            return Blob.build(data, { type: `${mime};BASE64` })
        }).then(blob => {
            console.log('going to upload');
            this.uploadBlobToFirebase(blob);
        }).catch(error => {
            console.error('fs error:', error);
        })
}

, а здесь uploadBlobToFirebase

uploadBlobToFirebase = (blob) => {
    const currentUserId = firebase.auth().currentUser.uid;
    const path = `/${currentUserId}/`;
    const unsubscribe = firebase.storage().ref(path).putFile(blob).on(
        firebase.storage.TaskEvent.STATE_CHANGED,
        (snapshot) => {
        const  progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
        //restricting progress to be shown with only 0,2,4,... 98, 100.
        if (progress % 2 == 0) {
            this.setState({
                uploadProgress: progress
            })
        }

        if (snapshot.state === firebase.storage.TaskState.SUCCESS) {
            this.setState({
                uploading: false,
            }, () => {
                //TODO: should also add this image to flatlist.
                //Get download url and set to image in flatlist.
                Alert.alert('Upload completed');
            })

          }
        },
        (error) => {
            this.setState({
                uploading: false,
            }, ()=>{
                unsubscribe();
                console.error(error);
            })
        },
      ); 
}

Функция handleUploadTask вызывается наonPress кнопки загрузки и работает нормально до console.log('going to upload'), а затем попадает в перехват с ошибкой:

'fs error:', {[TypeError: undefined не является функцией (оценивает ')filePath.replace ('file: //', '') ')] строка: 115903, столбец: 41, sourceURL:' http://10.0.2.2:8081/index.delta?platform=android&dev=true&minify=false'}

Я здесь абсолютно пуст.Не удалось найти file.replace, который вызывает проблему и почему.Любая помощь будет оценена.Спасибо.

1 Ответ

0 голосов
/ 08 декабря 2018

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

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

React Native Firebase действительно предоставляет некоторую статику, которая может помочь с поиском определенных каталогов на устройстве, например, где временный каталог находится через firebase.storage.Native.TEMPORARY_DIRECTORY_PATH.См. здесь для ознакомления с этими документами.

Он сконструирован так, поскольку передача файлов / BLOB-объектов по мосту React Native будет большим ударом по производительности по сравнению с сохранением всего собственного.

Исходя из вашего примера кода, вы должны сделать следующее:

firebase.storage().ref(path).putFile(imageSource.uri).on(/* ... */);

Справочные документы с примерами для putFile находятся здесь: https://rnfirebase.io/docs/v5.x.x/storage/reference/Reference#putFile

...