Число прогресса загрузки Firebase, превышающее 100, из snapshot.bytesTransferred / snapshot.totalBytes - PullRequest
0 голосов
/ 07 января 2020

До недавнего времени это работало нормально.

При загрузке файла я отслеживаю процесс загрузки следующим образом:

        uploadImage = uri => {
            const image = Platform.OS === 'ios' ? uri.replace('file://', '') : uri;
            const Blob = RNFetchBlob.polyfill.Blob;
            const fs = RNFetchBlob.fs;
            window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest;
            window.Blob = Blob;

            let uploadBlob = null;

            const imageRef = firebase
            .storage()
            .ref('categories/')
            .child(`${this.props.userData.uid}`)
            .child(`${this.state.img}`);

            const mime = this.state.isVideo ? 'video/mp4' : 'image/jpg';

            fs.readFile(image, 'base64')
            .then(data => {
                return Blob.build(data, {type: `${mime};BASE64`});
            })
            .then(blob => {
                uploadBlob = blob;
                this.uploadTask = imageRef.put(blob, {contentType: mime});

                this.uploadTask.on(
                'state_changed',
                snapshot => {
                    // Observe state change events such as progress, pause, and resume
                    // Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded
                    const progress =
                    (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
                    LayoutAnimation.easeInEaseOut();
                    this.setState({ uploadProgress: progress });
                    console.log(`Upload is ${progress}% done`);
                    switch (snapshot.state) {
                    case firebase.storage.TaskState.PAUSED: // or 'paused'
                        console.log('Upload is paused');
                        break;
                    case firebase.storage.TaskState.RUNNING: // or 'running'
                        console.log('Upload is running');
                        break;
                    }
                },
                error => {
                    // Handle unsuccessful uploads

                },
                () => {
                    // Handle successful uploads on complete
                },
                );
            });
        };

Вот как я отображаю число в мой компонент:

<Text>          
  {Math.trunc(this.state.uploadProgress)}%  
 </Text>

Я устанавливаю номер в состоянии моих компонентов, а затем показываю его пользователю. По какой-то причине в последнее время число превышает 100, оно показывает что-то большое, например 38154017.

Когда я регистрирую прогресс, я вижу, где он идет не так:

 console.log(`Upload is ${progress}% done`);

 LOG  Upload is 0% done
 LOG  Upload is 38.15395542514653% done
 LOG  Upload is 38.15395542514653% done
 LOG  Upload is 38154017.271191105% done
 LOG  Upload is 100% done

По какой-то причине прогресс прогресс умножает третий журнал на 100? Это происходит только примерно через месяц, и после исследования люди, кажется, все еще делают это следующим образом.

Вот журналы для bytesTransferred и totalBytes:

console.log(snapshot.bytesTransferred);

LOG  bytesTransferred 0
LOG  bytesTransferred 0262144
LOG  bytesTransferred 262144
LOG  bytesTransferred 262144524288
LOG  bytesTransferred 786432
LOG  bytesTransferred 786432176078

console.log(snapshot.totalBytes);

LOG  totalBytes 962510
LOG  totalBytes 962510
LOG  totalBytes 962510
LOG  totalBytes 962510
LOG  totalBytes 962510
LOG  totalBytes 962510
LOG  totalBytes 962510

Дон Не знаю, изменила ли Firebase что-то, но что бы это ни было, мне бы очень хотелось услышать комментарии людей!

Приветствия.

1 Ответ

0 голосов
/ 07 января 2020

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

Вот что я собираюсь использовать для временного решения:

this.setState({ 
   uploadProgress: progress > 100 ? this.state.uploadProgress + 7 : progress 
});

Я отправил сообщение об ошибке на firebase sdk и, надеюсь, скоро выложу лучший ответ ...

...