我有一个servlet,它使用Apache Commons FileUpload包来尝试向客户端发送进度信息。问题是,即使servlet在正确的时间将消息打印到printwwriter,但直到上传过程结束时客户端才接收到该信息。
下面是来自服务器的代码片段:
servletFileUpload.setProgressListener(new ProgressListener() {
private static final long BYTE_THRESHOLD = 10 * 1024 * 1024;
private long bytesReadLastTime = -1;
@Override
public void update(final long bytesRead, final long contentLengthInBytes,
final int itemNumber) {
if ((bytesRead / BYTE_THRESHOLD) == (bytesReadLastTime / BYTE_THRESHOLD)) {
return;
}
String message = itemNumber + "|" + bytesRead + "|" + contentLengthInBytes;
sendResponse(message); // Uses HttpServletResponse.getWriter().println()
bytesReadLastTime = bytesRead;
}
});
下面是来自客户端的代码片段(JavaScript):
_responseHandler: function (response) {
var data = response.split("|");
var fileNumber = data[0];
var bytesUploaded = data[1];
var bytesTotal = data[2];
console.log("File number: " + fileNumber +
", Bytes uploaded: " + bytesUploaded +
", Bytes total: " + bytesTotal);
}
}
当我上传一个大文件时,我看到servlet的sendResponse()
方法按预期的正确间隔被调用多次。但是使用Chrome的开发者控制台,我看到_responseHandler
直到上传操作结束才被调用,然后它被调用了很多次(好像所有来自servlet的消息都在最后被捆绑起来了)。
如果它是相关的,我的servlet在本地运行用于开发目的。
HTTP是一个请求-响应协议。客户端在完成发送请求之前不会寻找响应。