2016-09-28 54 views
0

我正在尝试创建一个进度条,该进度条显示来自球衣2.22客户端的文件上传进度。我试图按照此answer并使用WriteInterceptorOutputStream换成CountingOutputStream使用WriterInterceptor跟踪文件上传进度

现在的问题是,只要文件上传开始,全字节数就会在一秒内打印到控制台。但是,直到上传结束,很长一段时间都没有发生。

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

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

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); 
    } 
} 
+0

写入拦截器是用于出站的。 ReaderInterceptor用于入站。 –

+0

@peeskillet是真的。但我想从客户端上传文件到主机,并跟踪客户端的上传进度。所以WriterInterceptor应该是正确的..或不? – IIIIIIIIIIIIIIIIIIIIII

+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,缓冲将被禁用。