我有一个 servlet,它使用 Apache Commons FileUpload 包来尝试向客户端发送进度信息。问题是,即使 servlet 在正确的时间将消息打印到 PrintWriter,客户端也不会在上传过程结束之前收到该信息。
这是来自服务器的片段:
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 是一种请求-响应协议(protocol)。客户端在发送完请求之前不会寻找响应。
关于java - 为什么直到上传操作结束后客户端才检测到 HttpServletResponse 的 PrintWriter 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32260277/