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

     2023-02-22     34

关键词:

【中文标题】使用 RestTemplate.postForLocation 的文件上传进度条【英文标题】:File upload progress bar using RestTemplate.postForLocation 【发布时间】:2012-12-02 17:15:29 【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

这可能有你要找的东西***.com/questions/5294532/… 感谢您的链接。不幸的是,给出的示例使用了低级 apache 库,所以我不清楚 Spring Rest 库中等效的 FileBody 类是什么,或者我如何注入自己的实现供他们使用。 【参考方案1】:

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

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

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

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

这是working example for tracking file upload progress with RestTemplate.

【讨论】:

感谢您提供此信息,听起来就像我所追求的。 10 年太晚了,但迟到总比没有好?。希望它会对其他人有所帮助?【参考方案2】:

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

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

【讨论】:

对不起,但这没有帮助。原则上,这个解决方案是合理的,但正如我在 OP 中所说,流似乎在上传开始之前 被完全读取。所以进度条会飞快到 100%,然后不管上传花了多长时间。 ???上传前如何阅读?这是不可能的。如前所述,没有详细说明正在做什么或如何做。您必须提供实际详细信息才能提供更详细的答案。 另外,如果我们在这里谈论客户端,流是如何读取的?应该是客户端写的。 我指的流是本地文件的文件输入流,正在上传到远程服务器。我现在无法提供任何细节,因为这是我两年前参与的一个项目!正如我在 OP 中所说,我认为要上传的内容正在被缓冲,因此在任何网络流量开始之前,流已被完全读/写。所以我无法使用这些流来实现进度条。

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

】在使用加载数据流步骤的猪中,使用(使用PigStorage)和不使用它有啥区别?【英文标题】:InpigwhileusingLoaddataflowstepwhatisdifferencewithusing(UsingPigStorage)andwithoutusingit?在使用加载数据流步骤的猪中,使用(使用PigStorage)和不使用它... 查看详情

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

】MySQLdb在按日期排序时使用“使用位置;使用临时;使用文件排序”【英文标题】:MySQLdbisusing"Usingwhere;Usingtemporary;Usingfilesort"whensortingbydate【发布时间】:2011-07-2207:56:47【问题描述】:我有一个包含一堆记录的数据库,... 查看详情

如何使用 AutoMapper 使用 EntityFramework 使用嵌套列表更新对象?

】如何使用AutoMapper使用EntityFramework使用嵌套列表更新对象?【英文标题】:HowtouseAutoMapperforupdatingObjectwithnestedListusingEntityFramework?【发布时间】:2022-01-0315:40:44【问题描述】:我想使用AutoMapper将带有嵌套列表的EntityDto映射到实体... 查看详情

qt静态编译时使用openssl有三种方式(不使用,动态使用,静态使用,默认是动态使用)

WhencompilingQtyoucanchooseoneoftheseoptionsbasedontheconfigurecommandline:noOpenSSLsupport(-no-openssl)QtNetworkdynamicallyopeningOpenSSLlibs(-openssl;default)QtNetworklinkingtoOpenSSL(-openssl-linke 查看详情

何时使用自旋锁?何时使用互斥体?

中断上下文只能使用自旋锁。任务睡眠时只能使用互斥体。需求建议的加锁方法低开销加锁优先使用自旋锁短期锁定优先使用自旋锁长期加锁优先使用互斥体中断上下文加锁使用自旋锁持有锁需要睡眠使用互斥体  查看详情

kettlejava脚本组件的使用说明(简单使用升级使用)

文章目录前言Kettlejava脚本组件的使用说明(简单使用、升级使用)01简单使用02升级使用前言  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^_^。  而且听说点赞的人每天的运气... 查看详情

使用pidstat监控资源使用

 linux可以使用pidstat命令监控系统资源,比如监控cup使用如下:pidstat-u1还可以使用-r(内存)-d(硬盘) 查看详情

如何使用公钥加密字符串并使用 MimeKit 使用私钥解密?

】如何使用公钥加密字符串并使用MimeKit使用私钥解密?【英文标题】:HowtoencryptstringwithpublickeyanddecryptusingprivatekeyusingMimeKit?【发布时间】:2021-04-0118:27:35【问题描述】:我很难寻找有关如何使用公钥证书加密字符串并使用Mimekit... 查看详情

如何使用 webpack 使用它

】如何使用webpack使用它【英文标题】:Howtoconsumethiswithwebpack【发布时间】:2015-10-1405:17:20【问题描述】:如何在webpackreact应用程序中使用这个repo:https://github.com/chris-rudmin/Recorderjs我已经创建了一个新的库并以es6模块样式导出主... 查看详情

使用 C++ 和 Boost(或不使用?)检查是不是正在使用特定端口?

】使用C++和Boost(或不使用?)检查是不是正在使用特定端口?【英文标题】:UsingC++andBoost(ornot?)tocheckifaspecificportisbeingused?使用C++和Boost(或不使用?)检查是否正在使用特定端口?【发布时间】:2016-01-2607:04:05【问题描述】:... 查看详情

Mysql查询使用索引使用文件排序使用临时

】Mysql查询使用索引使用文件排序使用临时【英文标题】:Mysqlqueryusingindexusingfilesortusingtemporary【发布时间】:2014-08-2713:58:18【问题描述】:我的数据库中有以下两个表:表1:图片列:jeid[和其他]主键:jeid行数:160万表2:媒体... 查看详情

如何使用 React 使用 Notion API

】如何使用React使用NotionAPI【英文标题】:HowtoconsumeNotionAPIwithReact【发布时间】:2021-08-0601:54:19【问题描述】:我正在尝试使用新的NotionAPI作为我个人网站的CMS。作为一种改进方法,我尝试将它与React一起使用。但它似乎不允许CO... 查看详情

如何使用@JmsListener 暂停并开始使用消息

】如何使用@JmsListener暂停并开始使用消息【英文标题】:Howtopauseandstartconsumingmessageusing@JmsListener【发布时间】:2016-07-0223:47:57【问题描述】:我使用的是SpringBoot1.3.2版。我正在使用@JmsListener为我使用JmsTemplate创建/生成的消息使用... 查看详情

为啥使用最近最少使用的简单缓存机制?

】为啥使用最近最少使用的简单缓存机制?【英文标题】:WhyistheSimpleLeastRecentlyUsedCacheMechanismused?为什么使用最近最少使用的简单缓存机制?【发布时间】:2018-03-0208:27:47【问题描述】:我使用JProfiler检查Java微服务,同时使用JMe... 查看详情

使用 Makecert 设置密钥使用属性

】使用Makecert设置密钥使用属性【英文标题】:SettingKeyUsageattributeswithMakecert【发布时间】:2011-02-2615:45:58【问题描述】:是否可以使用makecert或任何其他我可以用来生成我自己的测试证书的工具来设置密钥使用属性?我感兴趣的... 查看详情

使用 multiDexEnabled 而不使用 Gradle,而是使用 Eclipse 构建过程

】使用multiDexEnabled而不使用Gradle,而是使用Eclipse构建过程【英文标题】:UsemultiDexEnabledwithoutGradlebutEclipsebuildprocessinstead【发布时间】:2015-01-0109:14:22【问题描述】:由于最新的SDK版本,创建具有多个dex文件(https://developer.android.co... 查看详情

使用 jQuery 使用 WCF 服务

】使用jQuery使用WCF服务【英文标题】:ConsumingWCFserviceusingjQuery【发布时间】:2011-08-1023:55:33【问题描述】:到目前为止,我已经使用了Web服务,并且运行良好。我添加了一个新的WCF服务。我正在使用jQuery调用服务。这就是我使用... 查看详情

如何使用 axios 发布使用 api

】如何使用axios发布使用api【英文标题】:Howtopostconsumeanapiwithaxios【发布时间】:2021-11-2603:10:15【问题描述】:我正在使用Vue应用程序并使用Axios进行api使用。我正在尝试使用来自AWS的oauthapi来获取令牌并在其他api中使用它。但是... 查看详情