Spring 使用restemplate.postForLocation文件上载进度栏

Spring 使用restemplate.postForLocation文件上载进度栏,spring,upload,progress-bar,multipart,resttemplate,Spring,Upload,Progress Bar,Multipart,Resttemplate,我有一个Java桌面客户端应用程序,可以将文件上传到REST服务 对REST服务的所有调用都使用SpringRESTTemplate类处理 我希望实现一个进度条和取消功能,因为上传的文件可能会很大 我一直在寻找一种在网络上实现这一点的方法,但没有成功 我尝试实现自己的ResourceHttpMessageConverter并替换writeInternal()方法,但在实际发布请求之前,似乎在某种缓冲操作期间调用了此方法(因此在发送之前,流是一次性读取的) 我甚至尝试过重写CommonClient

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

对REST服务的所有调用都使用SpringRESTTemplate类处理

我希望实现一个进度条和取消功能,因为上传的文件可能会很大

我一直在寻找一种在网络上实现这一点的方法,但没有成功

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

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

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

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


非常感谢任何帮助或提示

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

如果这确实是一个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();
        }
    }

这可能有你想要的,谢谢你的链接。不幸的是,给出的示例使用的是低级apache库,因此我不清楚Spring Rest库中的等效FileBody类是什么,也不清楚如何注入自己的实现供它们使用。原则上,这个解决方案是合理的,但正如我在OP中所说的,在上传开始之前,流似乎已被完全读取。因此,无论上传花了多长时间,进度条都会达到100%,然后保持不变。???上传前如何阅读?这是不可能的。如前所述,没有详细说明正在做什么或如何做。您必须提供实际的详细信息,并提供更详细的答案。此外,如果我们在这里讨论的是客户机,那么流是如何读取的?它应该是从客户端写入的,我指的是上传到远程服务器的本地文件的文件输入流。我现在不能提供任何细节,因为这是我两年前参与的一个项目!正如我在OP中所说的,我相信上传的内容是经过缓冲的,所以在任何网络流量开始之前,流是完全读/写的。因此,我无法使用这些流来实现进度条。