R Shiny:下载现有文件

54

假设在我的Shiny应用程序中已经有一个现有的 zip 文件 (out.zip),它位于服务器上。我希望用户能够下载这个文件。这个问题与这个问题非常相似。但是,在我的情况下,压缩文件已经存在,而不是在downloadHandler中压缩文件。

library(shiny)

app <- list(
  ui = fluidPage(
    titlePanel(""),
    sidebarLayout(
      sidebarPanel(
        downloadButton("downloadData", label = "Download")
      ),
      mainPanel(h6("Sample download", align = "center"))
    )
  ),

  server = function(input, output) {  
    output$downloadData <- downloadHandler(
      filename <- function() {
        paste("output", "zip", sep=".")
      },

      content <- function(file) {
        # not sure what to put here???
      },
      contentType = "application/zip"
    )
  }
)

shiny::runApp(app)
2个回答

77

在尝试不同的文件处理函数之后,我发现可以使用file.copy来下载文件。

我将downloadHandler更改为:

output$downloadData <- downloadHandler(
  filename <- function() {
    paste("output", "zip", sep=".")
  },

  content <- function(file) {
    file.copy("out.zip", file)
  },
  contentType = "application/zip"
)

2
你的压缩文件存放在哪里?是在www文件夹里还是可以在任意文件夹中? - zx8754
3
应该是你指定的任何文件夹。你只需要提供想要保存的路径即可。 - cdeterman
1
谢谢。为了澄清,"out.zip" 是我一个应用程序文件夹中存在的文件,对吗? - zx8754
5
这个解决方案在本地运行时是否有效,例如通过R Studio运行Shiny,还是只有在生产环境下才有效?在我的情况下,页面的HTML被下载。 - gkoul

28

几年后,如果您不需要通过动态生成文件来实现,我认为有一种更简单的方法,即将文件放置在Shiny应用程序的www /文件夹中:

|
|- app.R
|- www/
       - downloadme.csv

当您的Shiny应用程序上线后,该文件可在 shiny-url.com/downloadme.csv 上找到 - 或在本地测试时在 127.0.0.1:1221/downloadme.csv 上找到。

例如:在您的 Shiny 用户界面中使用:

# in ui somewhere
...
  a(href="downloadme.csv", "Download CSV", download=NA, target="_blank")
...

6
感谢您包含了这个回答。如果我不需要动态下载,就没有必要过于复杂化事情。 - nad7wf
1
除非您将它复制到www/文件夹中,否则不会生成所有Web文件的文件夹。 - MarkeD
优美的答案 - Preto
当我在浏览器中打开我的应用程序时,它只显示"http://127.0.0.1:7777/",是否应该像你展示的那样是127.0.0.1:1221/downloadme.csv? - Carlos Junior
1
对于一个至少是闪亮的 golem 应用程序,我需要使用 www/ 前缀: tags$a(href="www/downloadme.csv", "下载 CSV", download=NA) - user1582665
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接