如何在Shiny应用程序中下载PDF文件

15

我在我的shiny应用程序的www目录中有一个PDF文件。 我想让该文件可供下载。 我应该如何做?

下载示例很好,但不知道如何将其用于从www目录下载PDF。

## Only run examples in interactive R sessions
if (interactive()) {

ui <- fluidPage(
  downloadLink("downloadData", "Download")
)

server <- function(input, output) {
  # Our dataset
  data <- mtcars

  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(data, file)
    }
  )
}

shinyApp(ui, server)
}
3个回答

21

请查看 downloadHandler 函数文档,它有两个没有默认值的参数:filename 和 content。

filename 基本上是将要下载的文件名。它不必在函数内部定义。像这样定义也可以:filename = "your-pdf-name.pdf"

另一方面,content 会创建一个临时文件,用于存储即将被下载的内容。在大多数情况下,您会创建一个文件,并在应用程序中填充此文件。

如果这不适用于您的情况,我的解决方案提供了巴西称为“gambiarra”的东西:将要下载的文件复制到 shiny 需要使用的临时文件夹中,以使 downloadHandler 能够正常工作。(我试过只将其定义为文件路径,但那并不起作用)

ui <- fluidPage(
  downloadLink("downloadData", "Download")
)

server <- function(input, output) {

  output$downloadData <- downloadHandler(
    filename = "your-pdf-name.pdf",
    content = function(file) {
      file.copy("www/teste.pdf", file)
    }
  )
}

shinyApp(ui, server)

这个方案也适用于其他文件格式吗?我现在正在尝试用“.docx”来解决问题,但是无法下载我的文件。 - SharpSharpLes
当然可以。我建议您打开一个带有问题重现的问题。 - Tomás Barcellos
2
请注意,如果托管在服务器上,则此文件夹可能受到写保护。如果您使用downloadHandler,最好使用临时文件。 - Billy34
@Billy34 这一定就是我遇到的问题,我下载的文件是一个奇怪的类型,就好像受到了保护或者其他什么限制(下载图标上出现了锁)。如果你能帮助我,我刚刚发布了一个相关问题。 - Carlos Junior

3
如果文件在 www 文件夹中,那么您只需在 UI 中提供链接即可。
... (in UI)
  tags$a("Click here to get the PDF", href="your-pdf-name.pdf")
...

如果在开始时不知道文件名,则使用uiOutput/renderUI,并在生成文件名时将rv$filename设置为该文件名。
... (in UI)
  uiOutput("dlURL")
...


... (in server)
  rv <- reactiveValues(filename="")

  output$dlURL <- renderUI({
    tags$a("Click here to get the file", href=rv$filename)
  })
...

一年后,但我真的不知道www文件夹是什么,它是否与我的计算机中包含应用程序的文件夹相同?我是否应该以某种方式在我的代码中包含要下载的文件? - Carlos Junior
1
你好。www文件夹是你的应用程序文件夹的子文件夹。如果存在,它的内容将可以从浏览器中访问。例如,对于像图像、样式表、脚本或静态文档(如报告、手册等)这样的资源非常有用。 - Billy34
谢谢!我该如何访问这个www文件夹呢?我应该创建一个名为www的文件夹吗?我想让用户像这个例子一样下载现有的文件,唯一的区别是我有一个.xlsx文件而不是pdf。 - Carlos Junior
1
在您的应用文件夹中创建一个名为“www”的文件夹,将您的xlsx文件放入其中,并在UI中放置tags$a("点击此处获取XLSX", href="your-pdf-name.xlsx"),以便您的用户单击下载。 - Billy34
这个很好用!我的应用程序帮助用户创建感兴趣的某些文件。然后我使用我的包shinyDebuggingPanel(在github上),打开一个交互式的R框,使用control-D控制,并粘贴:system('cp file-to-download www')tags$a("点击此处获取文件", href="file-to-download")点击和!voila!在这里:文件在下载中。 PS:我经常使用shinyDebuggingPanel。 - Roger

0

(在“您的答案”中再次添加以使用格式。) @Bill34 给了我所需的答案,这篇文章扩展了这个想法。

我的应用程序帮助用户创建特定的感兴趣的文件。 然后我使用我的 shinyDebuggingPanel 包(放在 github 上),打开一个带有 control-D 控制的交互式 R 窗口,并粘贴:

system('cp file-to-download www') 
tags$a("Click here to get the file", href="file-to-download") 

点击,然后!哇啊!文件已下载并在您的本地下载文件夹中。

附注:我经常使用shinyDebuggingPanel。 忘记创建www文件夹了?没关系! 按Control-D打开shinyDebuggingPanel, 并粘贴以下内容: system('mkdir www')


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