如何在R的Shiny框架中记录文件下载的成功与失败状态?
记录Shiny下载操作的成功/失败状态
我们有如下极简Shiny应用:
library(shiny) app <- list( ui = fluidPage( downloadButton("downloadData", label = "Download") ), server = function(input, output) { output$downloadData <- downloadHandler( filename = "data.csv", content = function(file) { print("Download started") # 记录下载启动日志 write.csv(mtcars, file) } ) } ) shiny::runApp(app)
目前可以通过print()在标准输出记录下载启动日志,但下载可能因多种原因失败:比如用户取消下载、选择无写入权限的目录或存储盘空间不足。请问是否有方法记录下载完成的成功或失败状态?shiny::downloadHandler()的帮助文档未提供相关信息,也未在相关平台找到解决方案。
解决方案
可以通过**tryCatch捕获异常结合on.exit收尾处理**的方式,覆盖下载成功、主动取消、写入错误等场景的状态记录:
修改后的代码
library(shiny) app <- list( ui = fluidPage( downloadButton("downloadData", label = "Download") ), server = function(input, output) { output$downloadData <- downloadHandler( filename = "data.csv", content = function(file) { # 初始化成功标志 download_success <- FALSE # 注册退出时的处理逻辑,无论正常结束还是异常中断都会执行 on.exit({ if (download_success) { print("Download completed successfully") } else { print("Download failed or was cancelled by user") } }) # 用tryCatch捕获写入过程中的错误(如权限不足、磁盘空间不足) tryCatch({ print("Download started") write.csv(mtcars, file) # 正常完成后更新成功标志 download_success <- TRUE }, error = function(e) { # 记录具体错误信息 print(paste("Download failed with error:", e$message)) # 重新抛出错误,让Shiny向用户提示下载失败 stop(e) }) } ) } ) shiny::runApp(app)
场景说明
- 下载成功:
write.csv正常执行完毕,download_success设为TRUE,on.exit输出成功日志。 - 写入错误(如无权限、磁盘满):
tryCatch捕获错误,记录具体错误信息,然后抛出错误终止下载,on.exit输出失败日志。 - 用户取消下载:浏览器断开连接会中断
content函数的执行,download_success保持FALSE,on.exit输出取消/失败日志。
这样就能覆盖大部分常见的下载状态,实现日志记录。
内容的提问来源于stack exchange,提问作者Mori
相关产品推荐
相关产品推荐

