使用WriterInterceptor跟踪文件上载进度

时间:2016-09-28 11:32:53

标签: java jersey

我正在尝试创建一个进度条,显示从具有jersey 2.22的客户端上传文件的进度。我尝试按照此answer使用WriteInterceptorOutputStream打包成CountingOutputStream

现在的问题是,一旦文件上传开始,完整的字节数就会在一秒钟内打印到控制台。但是在上传完成之前很长一段时间都没有发生任何事情。

我很确定我只是使用此解决方案跟踪写入客户端缓冲区的字节(而不是真正发送给主机的字节)。

所以我的问题是:我在这里误解了什么吗?或者是否根本无法跟踪从客户端到主机的发送字节?

public class UploadMonitorInterceptor implements WriterInterceptor {

    @Override
    public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
        final OutputStream os = context.getOutputStream();                    

        context.setOutputStream(new MyCountingOutputStream(os));

        context.proceed();          
    }
}

MyCountingOutputStream类:

public class MyCountingOutputStream extends CountingOutputStream {
    public MyCountingOutputStream(OutputStream out) {
        super(out);
    }

    @Override
    public void write(byte[] b,int st,int end) throws IOException {
        super.write(b,st,end);
        System.out.println("ByteCount:"+end);
    }
}

1 个答案:

答案 0 :(得分:0)

我终于能够解决我的问题了。实际上我只是将流的写命令跟踪到缓冲区中。我现在所做的是将chunkedStreamingMode设置为1024。然后我只需要将接收到的提供程序从以下函数设置为客户端的连接器。

private static HttpUrlConnectorProvider buildHttpUrlConnectorProvider(){
             HttpUrlConnectorProvider.ConnectionFactory factory = new HttpUrlConnectorProvider.ConnectionFactory() {
                    @Override
                    public HttpURLConnection getConnection(URL url) throws IOException {
                        HttpURLConnection result = (HttpURLConnection) url.openConnection();
                        result.setChunkedStreamingMode(1024);
                        return result;
                    }
                };
             return new HttpUrlConnectorProvider().connectionFactory(factory);
        }

据我了解,如果设置了chunkedStreamingMode,则会禁用缓冲。