我有一个Java桌面客户端应用程序,可以将文件上传到REST服务。
对REST服务的所有调用都使用Spring RestTemplate类进行处理。
我希望实现一个进度条和取消功能,因为上传的文件可能很大。
我一直在寻找一种在网络上实现这一点的方法,但一直没有成功。
我尝试实现我自己的ResourceHttpMessageConverter并替换writeInternal()方法,但这个方法似乎是在实际发布请求之前的某种缓冲操作中调用的(因此在发送之前会一次性读取流)。
我甚至尝试过重写CommonsClientHttpRequestFactory.createRequest()方法,并用一个特殊的writeRequest()实现我自己的RequestEntity类,但也出现了同样的问题(在实际发送帖子之前,流都被读取了)。
我找错地方了吗?有人做过类似的事吗。
我在网上读到的很多关于实现进度条的东西都谈到了开始上传,然后使用单独的AJAX请求来轮询网络服务器的进度,这似乎是一种奇怪的方式
非常感谢任何帮助或提示。
这是一个老问题,但它仍然相关。
我尝试实现我自己的ResourceHttpMessageConverter并替换writeInternal()方法,但这个方法似乎是在实际发布请求之前的某种缓冲操作中调用的(因此在发送之前会一次性读取流)。
你走在了正确的轨道上。此外,您还需要禁用RestTemplate的HttpRequestFactory上的请求主体缓冲,类似于以下内容:
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setBufferRequestBody(false);
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
下面是一个使用RestTemplate跟踪文件上传进度的工作示例。
关于这个应用程序是什么,或者它是如何工作的,没有太多细节,所以这个响应很模糊,但我相信你可以这样做来跟踪你的上传进度。
如果这真的是一个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();
}
}