Quarto仪表盘Shiny模块中downloadButton结合file.copy的路径问题
问题根源
你当前的代码存在两个核心问题:
downloadHandler的content函数中,参数file是服务器端生成的临时文件路径,并非用户本地Downloads文件夹里的文件,所以你拼接的/Users/quinten/Downloads/${file}路径根本不存在,导致file.copy执行失败。- 浏览器的下载路径由用户浏览器设置决定,前端应用(包括Quarto/Shiny)无法直接指定用户本地的下载目标路径,这是浏览器的安全限制。
解决方案
根据你的需求场景,提供两种可行方案:
场景1:在服务器端保存文件副本
如果需要在服务器上同步保存一份文件副本,再提供给用户下载,直接在content函数中先写入服务器指定路径,再写入临时文件即可:
修改后的服务器端代码:
#| context: server library(shiny) # 获取选中的数据集 data <- reactive({ get(input$dataset) }) output$downloadData <- downloadHandler( filename = function() { paste0(input$dataset, ".csv") }, content = function(file) { # 1. 先将文件写入服务器的指定路径 server_target <- paste0("/Users/quinten/", input$dataset, ".csv") write.csv(data(), server_target) # 2. 再将内容写入临时文件,供用户下载 write.csv(data(), file) } )
执行后,服务器的/Users/quinten/目录下会生成对应数据集的CSV文件,同时用户仍能正常下载文件到浏览器默认的Downloads文件夹。
场景2:让用户自主选择本地保存路径
如果需要让用户自行选择本地的保存路径,可使用shinyFiles包的shinySaveButton绕过浏览器限制,实现本地路径选择功能:
完整修改后的代码:
--- title: "Test" format: dashboard server: shiny ---
library(shiny) library(shinyFiles)
p("Choose a dataset to download.") selectInput("dataset", "Dataset", choices = c("mtcars", "airquality")) shinySaveButton("saveData", "Save As", "Choose where to save the file", filetype = list(csv="csv"))
#| context: server data <- reactive({ get(input$dataset) }) shinySaveServer("saveData", function(filepath, ...) { write.csv(data(), filepath) }, roots = c(home = "/Users/quinten/"), # 设置用户可访问的本地根目录 filetypes = c("csv") )
用户点击按钮后会弹出文件选择对话框,可自主设置保存路径和文件名。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

