Node.js 从snapshot.bytesttransfered/snapshot.totalBytes开始,Firebase上载进度编号超过100
直到最近,这项技术一直运作良好 上传文件时,我会像这样跟踪上传进度:Node.js 从snapshot.bytesttransfered/snapshot.totalBytes开始,Firebase上载进度编号超过100,node.js,reactjs,firebase,react-native,firebase-storage,Node.js,Reactjs,Firebase,React Native,Firebase Storage,直到最近,这项技术一直运作良好 上传文件时,我会像这样跟踪上传进度: uploadImage = uri => { const image = Platform.OS === 'ios' ? uri.replace('file://', '') : uri; const Blob = RNFetchBlob.polyfill.Blob; const fs = RNFetchBlob.fs;
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?这只发生在大约一个月后,经过研究,人们似乎仍然这样做
以下是ByTestTransfered和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是否改变了什么,但不管是什么,我都希望听到人们的评论
干杯。我知道这并不理想,但一个潜在的解决方案可能是,如果当前进度超过100,则根据当前进度添加一个数字,以使其流动并复制一个不断增加的上载任务 以下是我将使用的临时解决方案:
this.setState({
uploadProgress: progress > 100 ? this.state.uploadProgress + 7 : progress
});
我已经在firebase sdk上提交了一份错误报告,希望不久能发布一个更好的答案…我知道这并不理想,但一个潜在的解决方案可能是在当前进度的基础上添加一个数字,如果它达到100以上,使其流动并复制一个不断增加的上传任务 以下是我将使用的临时解决方案:
this.setState({
uploadProgress: progress > 100 ? this.state.uploadProgress + 7 : progress
});
我已经在firebase sdk上提交了一份错误报告,希望不久能发布一个更好的答案…请编辑问题以显示此处使用的所有代码,包括接收uploadProgress值的任何组件,甚至日志语句。我们应该能够跟踪存储回调和记录消息的代码行之间可能发生的一切。@DougStevenson谢谢,我已经更新了我的问题。我建议还记录
snapshot.bytesttransfered
和snapshot.totalBytes
的值,这会导致计算不合理。@DougStevenson好主意,问题已编辑!它的日志语句是什么样子的?您应该知道totalBytes永远不会改变。这是您正在上载的文件的大小。请编辑问题以显示此处使用的所有代码,包括接收uploadProgress值的任何组件,甚至日志语句。我们应该能够跟踪存储回调和记录消息的代码行之间可能发生的一切。@DougStevenson谢谢,我已经更新了我的问题。我建议还记录snapshot.bytesttransfered
和snapshot.totalBytes
的值,这会导致计算不合理。@DougStevenson好主意,问题已编辑!它的日志语句是什么样子的?您应该知道totalBytes永远不会改变。这是您正在上载的文件的大小。