我使用XMLHttpRequest上传文件。如果服务器响应错误消息500,我将尝试处理onprogress
事件之前的错误消息。
XMLHttpRequest
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (oEvent) {
if (xhr.readyState === 4) {
if (xhr.status === 500) {
console.log('error2');
}
}
};
xhr.onload = function() {
if (this.status == 200) {
console.log('success');
}
};
xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
var percentComplete = (e.loaded / e.total) * 100;
console.log(percentComplete);
}
};
xhr.open("POST", "http://127.0.0.1:1337/upload-file", true);
var formData = new FormData();
formData.append("file", e.file);
xhr.send(formData);
我故意在服务器上抛出错误消息:
const Koa = require('koa');
const Router = require('koa-router');
const cors = require('@koa/cors');
const serve = require('koa-static');
const path = require('path');
const koaBodyMultipart = require('koa-body')({ multipart: true });
const app = new Koa();
app.use(cors());
app.use(serve(path.join(process.env.PWD, '/dist')));
const router = new Router();
router
.post('/upload-file', koaBodyMultipart, (ctx, next) => {
const { file } = ctx.request.files;
// if (file) {
// ctx.response.body = 'ok';
// } else {
// ctx.throw(500,'Error Message');
// }
ctx.throw(500,'Error Message');
});
app.use(router.routes()).use(router.allowedMethods());
// don't listen to this port if the app is required from a test script
if (!module.parent) {
var server = app.listen(process.env.PORT || 1337);
var port = server.address().port;
console.log('running at port:' + port)
}
为什么upload.onprogress
在xhr.onreadystatechange
和xhr.onload
之前被触发?在显示上传进度之前如何显示错误消息?
答案 0 :(得分:1)
我写了一个简单的脚本来检查事件的顺序。事件的顺序总是以这种方式发生:
readystateChange: 1
loadstart
XHR OPTIONS http://127.0.0.1:1337/upload-file [HTTP/1.1 204 No Content 24ms]
XHR POST http://127.0.0.1:1337/upload-file [HTTP/1.1 500 Internal Server Error 20ms]
progress
load
loadend
readystateChange: 2
readystateChange: 3
readystateChange: 4
Progress
事件始终在load
事件之前触发。
由于在显示错误消息之前已更新进度,因此您可以将进度更新到一定的百分比,例如95%。然后在loadend
或readyStateChange
事件中处理其余的更新。例如:
xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
var percentComplete = (e.loaded - e.total*0.05 / e.total) * 100;
percentComplete = percentComplete < 0? 0: percentComplete;
console.log(percentComplete);
}
};
xhr.onreadystatechange = function (oEvent) {
if (xhr.readyState === 4) {
if (xhr.status === 500) {
// Handle error case
} else if (xhr.status === 200){
percentComplete = 100;
}
}
};
答案 1 :(得分:0)
根据XMLHttpRequest Level 2 - Determinate if upload finished
在发送和接收数据时,将调用progress,即使在响应为错误的情况下,发送文件时也会发生这种情况。状态更改事件只有在所有操作完成且服务器关闭连接后才会触发。