#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
- filename.hdf5
- filename.csv
И я хочу получить это:
Results.zip
- filename.hf5
- 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 (файлы и папки и файлы внутри папок …) Возможно, я не совсем ясно объяснил себя