You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:41:16