为什么客户端在上传操作结束之前没有检测到HttpServletResponse's printwwriter内容



我有一个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是一个请求-响应协议。客户端在完成发送请求之前不会寻找响应。

相关内容

  • 没有找到相关文章

最新更新