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

gli*_*ter 5 upload spring multipart resttemplate progress-bar

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

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

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

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

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

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

我在找错了地方吗?有没有人做过类似的事情.

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

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

Bri*_*anC 0

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

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

当你获取文件时,获取它的大小。

Integer totalFile = file.getTotalSpace();
Run Code Online (Sandbox Code Playgroud)

无论您在何处作为流传输,您都可能将字节添加到某种输出缓冲区中

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)