使用RestTemplate.postForLocation的文件上载进度条

时间:2012-12-14 17:05:28

标签: spring upload progress-bar multipart resttemplate

我有一个Java桌面客户端应用程序,可以将文件上传到REST服务。

使用Spring RestTemplate类处理对REST服务的所有调用。

我正在寻求实施进度条并取消功能,因为上传的文件可能非常大。

我一直在寻找一种在网上实现这一点的方法,但没有运气。

我尝试实现自己的ResourceHttpMessageConverter并替换writeInternal()方法,但在实际发布请求之前,似乎在某种缓冲操作期间调用了此方法(因此在发送之前一次性读取流)

我甚至尝试重写CommonsClientHttpRequestFactory.createRequest()方法并使用特殊的writeRequest()方法实现我自己的RequestEntity类,但是会出现同样的问题(在实际发送帖子之前都会读取流)。

我在寻找错误的地方吗?有没有人做过类似的事情。

我在网上看到的关于实现进度条的很多内容都谈到了关闭上传,然后使用单独的AJAX请求来轮询Web服务器以获得进展,这似乎是一种奇怪的方式。< / p>

任何帮助或提示非常感谢。

1 个答案:

答案 0 :(得分:0)

关于这个应用程序是什么或它是如何工作的没有太多细节所以这个回复是模糊的,但我相信你可以做这样的事情来跟踪你的上传进度。

如果这确实是一个Java客户端应用程序(即不是HTML / JavaScript而是一个java程序)并且你真的让它上传一个文件作为流,那么你应该能够通过计算中的字节来跟踪你的上传进度数组在流缓冲区中传输,并将其与文件对象的总字节数进行比较。

当你获得文件的大小时。

Integer totalFile = file.getTotalSpace();

无论您何时以流形式传输,都可能会将字节添加到某种输出缓冲区

byte[] bytesFromSomeFileReader =  [whatEverYouAreUsingToReadTheFile];

    ByteArrayOutputStream byteStreamToServer = new ByteArrayOutputStream();
    Integer bytesTransmitted = 0;

    for (byte fileByte : bytesFromSomeFileReader) {
        byteStreamToServer.write(fileByte);
            //
            //  Update your progress bar every killo-byte sent.
            //
        bytesTransmitted++;
        if( (bytesTransmitted % 1000) = 0) {
            someMethodToUpdateProgressBar();
        }
    }