Java HttpUrlConnection实际发送字节的状态

5
我实现了一个WebRequest类,用于处理基本的GET和POST请求以及URLConnections。其中一个功能是提交文件。现在我想计算并显示上传文件的进度,但我不知道该如何做到这一点。
    for (KeyFilePair p : files) {
        if (p.file != null && p.file.exists()) {
            output.writeBytes("--" + boundary + "\n");
            output.writeBytes("Content-Disposition: form-data; name=\""
                    + p.key + "\"; filename=\"" + p.file.getName() + "\"\n");
            output.writeBytes("Content-Type: " + p.mimetype
                    + "; charset=UTF-8\n");
            output.writeBytes("\n");

            InputStream is = null;
            try {
                long max = p.file.length();
                long cur = 0;
                is = new FileInputStream(p.file);
                int read = 0;
                byte buff[] = new byte[1024];
                while ((read = is.read(buff, 0, buff.length)) > 0) {
                    output.write(buff, 0, read);
                    output.flush();
                    cur += read;
                    if (monitor != null) {
                        monitor.updateProgress(cur, max);
                    }
                }
            } catch (Exception ex) {
                throw ex;
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
    }
    output.writeBytes("\n--" + boundary + "--\n");

在这段代码中,您可以看到将字节数计算到OutputStream输出流的基本操作。但由于在打开连接的InputStream(或读取状态码)之前,请求甚至没有发送到服务器,因此这种字节计数是完全无用的,只显示请求准备过程的进度。
所以我的问题是: 如何监视实际发送到服务器的当前字节数?我已经检查了相应类(HttpUrlConnection)的getInputStream的Java源代码,试图理解何时以及如何将实际字节写入服务器...但是没有得出结论。
有没有一种方法可以在不编写自己的http协议实现的情况下实现这一点?
谢谢
最好的问候 马特
1个回答

7
您需要设置 conn.setChunkedStreamingMode(-1); // 使用默认块大小
否则,HUC 会缓冲整个数据,以了解要设置为Content-Length的值。您实际上正在监视缓冲过程。
作为替代方法,您可以计算多部分正文的大小(祝您好运!)并调用 conn.setFixedLengthStreamingMode(lengthInBytes)
您可以在HttpUrlConnection带有进度条的多部分文件上传中找到更多信息

所以,如果您在文件上使用缓冲流,那么我不会看到相同的问题,因为缓冲流在我开始读取之前已经对其进行了缓冲(在幕后),对吗? - stdout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接