java - 为什么直到上传操作结束后客户端才检测到 HttpServletResponse 的 PrintWriter 内容?

标签 java servlets file-upload

我有一个 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/

相关文章:

java - 从对象中私有(private)的关键字段获取 MethodHandle 列表

java - servlet java 中的错误

java - Maven多模块项目添加Axis2导致的依赖冲突如何解决

javascript - Strapi - 如何同时上传文件和创建新模型条目?

java - 如何在网络服务器外上传文件?

java - 在 Eclipse 应用程序中安装时,找不到 Eclipse plugin.xml 文件中的国际化字符串

java - 这个函数是原子函数吗?

java - 将数据从 Servlet 传递到 JSP(实时)

laravel - 在 Laravel 5.4 中获取上传失败文件的文件名

file-upload - Jersey 服务文件上传导致 OutOfMemoryError