我正在使用node.js-expresss后端和可怕的包。我试图实现一个进度条,并决定使用formidable & websockets:
const create = (req, res, io) => {
logger.debug(`EXEC create material`)
const form = new formidable.IncomingForm()
form.encoding = 'utf-8'
form.keepExtensions = true
form.multiples = true
form.maxFileSize = 600 * 1024 * 1024 // 600MB instead of 200MB (default value)
// form.uploadDir = `${__dirname}/uploads`
let oldValue = 0
form.on('progress', (bytesReceived, bytesExpected) => {
let currentValue = (parseFloat(bytesReceived) / parseFloat(bytesExpected)) * 100
if ((currentValue - oldValue) > 1 || currentValue === 100) {
oldValue = currentValue
io.emit('FILE_UPLOAD_STATUS', currentValue)
console.log('FILE_UPLOAD_STATUS', currentValue)
}
})
...然而,它看起来处理文件,并显示进度,一旦所有的文件都上传了?文件可能非常大,所以我在浏览器中看到一个空的进度条,直到最后在很短的时间内从0%增加到100%。
我是否应该更改我的代码并从xhr请求中获取进度?
发布于 2020-02-18 17:55:07
最后,我决定将它成功地转移到浏览器内部的js上。使用axios,因为它是处理进度的最简单/最快的方法。这是我感兴趣的代码(React应用程序):
axios.request({
method: "POST",
url: `${PRIVATE_API_ROOT}/materials`,
data: formData,
headers: { Authorization: `Bearer ${token}` },
onUploadProgress: ProgressEvent => {
this.setState({
progressStatus: parseFloat(ProgressEvent.loaded / ProgressEvent.total * 100).toFixed(2),
})
}
}).then(data => {
this.setState({
progressStatus: 100,
loading: false,
error: ''
})
}).catch(function (error) {
//handle error
this.setState({ error: error.message })
});https://stackoverflow.com/questions/60258489
复制相似问题