使用curl::curl_upload上传大文件时进度显示崩溃的解决咨询
解决curl::curl_upload上传大文件时进度显示崩溃的问题
问题原因分析
你推测的完全正确:报错根源是默认进度逻辑里sprintf用了%d整数格式符。32位有符号整数的最大值是231-1(即2147483647),你上传的字节数2147418112已经非常接近这个阈值,加上进度按216步长更新,下一次统计的字节数会超出32位有符号整数范围,R会自动将其转为浮点型,此时用%d格式就会触发类型不匹配的报错。
解决方案
你复制代码自定义curl_upload2的思路可行,但有更简洁的替代方案——直接自定义进度回调函数,无需复制整个curl_upload代码:
- 定义自定义进度回调函数
custom_progress <- function(total_bytes, uploaded_bytes) { # 用%.0f处理大数值,保证整数显示且不报错 cat(sprintf("\rUploaded %.0f bytes...", uploaded_bytes)) # 上传完成后换行提示 if (uploaded_bytes == total_bytes) cat("\nUpload complete!\n") }
- 调用curl_upload时传入自定义进度函数
保持verbose = TRUE以保留进度显示,同时通过progress参数替换默认逻辑:
curl::curl_upload( "你的大文件路径.csv", url = "ftp://你的服务器地址/目标路径.csv", verbose = TRUE, progress = custom_progress )
方案对比
- 自定义进度回调的方式更轻便,不用维护完整的
curl_upload代码,后续curl包更新时也无需同步修改自定义函数的其他部分。 - 若你坚持复制原函数修改,注意要把所有涉及字节数统计的
%d格式都替换成%.0f,避免遗漏其他可能触发报错的地方。
内容的提问来源于stack exchange,提问作者qwertzuiop
相关产品推荐
相关产品推荐

