7

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

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

我希望实现一个进度条并取消功能,因为正在上传的文件可能非常大。

我一直在寻找一种在网络上实现此功能的方法,但没有运气。

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

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

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

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

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

4

2 回答 2

1

这是一个古老的问题,但它仍然是相关的。

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

你走在正确的轨道上。此外,您还需要在 RestTemplate 的 HttpRequestFactory 上禁用请求正文缓冲,如下所示:

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setBufferRequestBody(false);
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

这是一个使用 RestTemplate 跟踪文件上传进度的工作示例。

于 2022-01-08T20:20:14.440 回答
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();
        }
    }
于 2015-10-21T20:17:31.757 回答