【发布时间】:2020-06-01 07:02:17
【问题描述】:
我正在开发一个可以上传和下载文件的 Reactjs 项目。
但是当我上传文件时,来自 Axios 的 PUT 请求在文件完全上传到我的数据库之前完成。 我使用 Axios 的 onUploadProgress,点击上传按钮后它直接显示 100%,而文件尚未上传。
似乎只有在进度条达到100%时才开始背面文件的上传。 我不知道如何正确同步进度条和文件上传。
我的代码
正面
onUpload() {
const data = new FormData();
for (var i = 0; i < this.state.selectedFile.length; i++) {
data.append("file", this.state.selectedFile[i]);
}
axios
.put("http://localhost:5000/api/files/upload", data, {
onUploadProgress: ProgressEvent => {
this.setState({
loaded: Math.round(
(ProgressEvent.loaded * 100) / ProgressEvent.total
)
});
}
})
.then(res => {
console.log("File(s) uploaded", res);
});
}
返回
export const uploadFile = (req, res) => {
const myFile = (Array.isArray(req.files.file)
? req.files.file
: [req.files.file]
).filter(e => e);
// upload file(s) to directory
for (let i = 0; i < myFile.length; i++) {
myFile[i].mv("./src/uploads/" + myFile[i].name, function(err) {
if (err) {
return res.status(500).send(err);
}
});
// save file(s) to database
Upload.create({
type: myFile[i].mimetype,
name: myFile[i].name,
data: myFile[i].data
});
}
res.send("file uploaded !");
};
顺便说一句,我使用https://www.npmjs.com/package/express-fileupload 进行文件上传
编辑
onUpload() {
const data = new FormData();
for (var i = 0; i < this.state.selectedFile.length; i++) {
data.append("file", this.state.selectedFile[i]);
}
axios
.post("http://localhost:5000/api/files/upload", data, {
headers: {
"Content-type": "multipart/form-data"
},
onUploadProgress: ProgressEvent => {
this.setState({
loaded: Math.round(
(ProgressEvent.loaded * 100) / ProgressEvent.total
)
});
}
})
.then(res => {
console.log("File(s) uploaded", res);
});
}
【问题讨论】:
-
有两件事对我来说似乎不正确,您使用的是不合适的 PUT 方法,因为您正在数据库中创建新条目(因此更喜欢使用 POST),并且您正在不通过 content-type header
multipart/form-data(第二个是最重要的)尝试使用这个 content-type header -
没有办法从服务器到前端就进度进行通信,除非您想在每毫秒内进行一次服务器调用以了解进度。我建议您在 onUploadprogress 事件中将进度条设置为 95%,并在 .then 事件中完成承诺。
-
@MehdiBenmoha 对于一些测试我创建了上传按钮,通常这个代码由我的提交按钮调用,并且 multipart/form-data 在表单内。正如您在我的编辑中看到的那样,我更改了我的代码,但没有任何改变。
-
@SachinVishwakarma 我该怎么做?
-
添加答案作为对您评论的回复。
标签: javascript reactjs file-upload axios