Как загрузить существующую папку в формате zip?

#shiny #download #zip

#блестящий #Скачать #zip

Вопрос:

Я хочу знать, как загрузить папку со всеми файлами внутри нее. Я попробовал это:

Пользовательский интерфейс.

 downloadButton("downloadresults")
  

Сервер

 #To create the directory where store the files
dir.create(session$token) 

#Action on download button
output$download <- downloadHandler(
filename <- function(){
  paste("Results","zip", sep = ".")
  },
content <- function(file) {
  path <- session$token
  files <- list.files(path, recursive = T)
  zip(file, files)
  },
contentType = " application/zip"
) 
  

Это возвращает HTML-файл. Почему это происходит? Как активно загрузить папку как .zip.

РЕДАКТИРОВАТЬ ОДИН

Из-за комментария @YBS я изменил пользовательский интерфейс:

 downloadButton("download") 
  

При этом файл не загружается, и я не получал никаких сообщений об ошибках или предупреждений

РЕДАКТИРОВАТЬ ДВА

До сих пор мне удавалось загружать файлы, используя следующий код:

Пользовательский интерфейс:

 downloadButton("download ")
  

Сервер

 #To create the directory where store the files
dir.create(session$token)

#Action on download button
output$download <- downloadHandler(
filename = function(){
  paste(" Results", "zip", sep = ".") 
  },
content = function(file) {
  path <- session$token
  zip::zipr(file, path)
  },
contentType = " application/zip"
) 
  

Я понимаю это:

Results.zip

  • папка session $token
    1. filename.hdf5
    2. filename.csv

И я хочу получить это:

Results.zip

  1. filename.hf5
  2. filename.csv

Комментарии:

1. В пользовательском интерфейсе у вас должно быть downloadButton("download") . Обратите внимание, что кнопка неправильно написана как кнопка.

2. @YBS спасибо за ваше предложение, я попробовал и тоже не сработал. Похоже, что-то еще не так

Ответ №1:

Основываясь на ответах, данных @YBS, мне удалось решить эту проблему следующим образом:

 library(shiny)
library(zip)

ui <- fluidPage(
  #Select a number
  numericInput("firstnumber", "Select a number", 1, min = 1),

  #Select another number
  numericInput("secondnumber", "Select a number", 1, min = 1),

  #Make calculation
  actionButton("calculation","GO"),

  #Alert results are ready
  uiOutput("alert"),

  #Download button
  downloadButton("download")
)

server <- function(input, output, session) {
  
  #To create directory
  dir.create(session$token)

  #To create folder inside directory
  FOLDER <- paste0(session$token,"/Folder")
  dir.create(FOLDER)
  
  #Reactive value to store the path of all the files in the directory
  mylist <- reactiveValues()
  mylist$files <- NULL
  
  #Go button action
  observeEvent(input$calculation,{

    #Calculations
    SUM <- input$firstnumber   input$secondnumber
    SUBSTRACTION <- input$firstnumber - input$secondnumber
    DIVIDE <- input$firstnumber/input$secondnumber
    MULTIPLY <- input$firstnumber *  input$secondnumber

    #Storing results in a data frame
    S_and_S <- data.frame(SUM,SUBSTRACTION)
    D_and_M <- data.frame(DIVIDE,MULTIPLY)

    #Alert results are ready
    output$alert <- renderUI({
      h5("Results are ready", style = "color:green")
    })

    #Saving data frame in directory as Results.csv
    write.csv(S_and_S, file = paste0(session$token,"/Results.csv"))

    #Savin data frame in directory as results.csv
    write.csv(D_and_M, file = paste0(FOLDER,"/results.csv"))

    #Store all the path of the files in the directory in the reactive value
    mylist$files <- list.files(session$token,"*.*")
  })
  
  #Action on download button
  output$download <- downloadHandler(
    filename = function(){
      "Results.zip"
    },
    content = function(file){
      
      files <- c()
      
      for (i in 1:length(mylist$files)) {
        files[i] <- paste0(session$token,"/",mylist$files[i])
      }
      
      zipr(zipfile = file, files = files)
    },
    
    contentType = "application/zip"
  )
  
}

shinyApp(ui, server)
  

Комментарии:

1. @YBS Я только что добавил, например, создание и сохранение файла в каталоге. Считаете ли вы, что примера достаточно? , потому что пользователи могут использовать разные методы сохранения, но важно указать правильный путь (в данном случае paste0(session$token, "/filename.fileextension") .

2. @YBS на самом деле вы можете загружать несколько типов файлов независимо от расширения. Вот почему я считаю, что наиболее важной частью примера создания файла является указание пути к файлу, и для этого я спрашиваю, достаточно ли хорош пример или мне следует добавить другие с другими функциями сохранения?

3. @YBS добавлен полностью воспроизводимый пример. Все в порядке?

4. Выглядит великолепно. Однако в results.csv есть одна запись с вычислениями, которые вы выполняете на сервере. Я думал, вы хотите «загрузить папку и все файлы внутри нее». Возможно, я неправильно понял ваши ожидания.

5. @YBS Я получаю именно то, что хотел: Results.zip файл со всем содержимым каталога session $ token (файлы и папки и файлы внутри папок …) Возможно, я не совсем ясно объяснил себя