簡體   English   中英

使用WriterInterceptor跟蹤文件上傳進度

[英]Track file upload progress with WriterInterceptor

我正在嘗試創建一個進度條,該進度條顯示使用jersey 2.22從客戶端上傳文件的進度。 我試圖遵循此答案,並使用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);
    }
}

我終於能夠解決我的問題。 實際上,我只是將流的寫入命令跟蹤到緩沖區中。 我現在所做的是將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 ,緩沖將被禁用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM