R / Shiny: скачать несколько файлов (zip) из папки на сервере - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы создать zip-архив (содержащий несколько файлов xlsx) и сохранить его локально. Файлы хранятся в папке на стороне сервера. Пользователь выбирает файлы для архивации с помощью checkboxInput.

Вот код для флажка:

  get.files <- reactive({
    list.files("output_file/")
  })  

obsList <- list()

output$links_list <- renderUI({    
    lapply(as.list(1:length(get.files())), function(i)
    {
      btName <- get.files()[i]
      # creates an observer only if it doesn't already exists
      if (is.null(obsList[[btName]])) {
         obsList[[btName]] <<- btName 
      }
      fluidRow(checkboxInput(btName, get.files()[i])  )
    })
})

Флажки создаются динамически, читая содержимое в папке («output_file /»). Рядом с каждым флажком находится название файла.

Функция для скачивания:

output$downloadzip<-downloadHandler(
    filename = function(){
      paste0("Extract.zip")
    },
    content = function(file){
      files <- NULL;
      for (i in 1:length(obsList)){
        if(input[[obsList[[i]]]])
          files <- c(paste("output_file/",obsList[[i]],sep=""),files)
      }
      #create the zip file
      zip(file,files)
    },
    contentType = "application/zip"
  )

Функция создает массив имен файлов (файлов), используя только имена файлов, которые были проверены.

Я также создал функцию, которая позволяет мне проверять, выбраны ли только нужные файлы:

tempText <- eventReactive({input$TempTest},{ 
    l<-c()
    for (i in 1:length(obsList)){

      if(input[[obsList[[i]]]])
        l<-c(l,paste("output_file/",obsList[[i]],sep=""))
    }

    return(paste(l) )
  },
  ignoreInit = TRUE)

  output$Temp <-  renderPrint({ tempText()}) 

Эта функция корректно отображает строки с именами файлов.

Ошибка, которую я получаю при попытке загрузить zip-файл:

sh:: команда не найдена

Может кто-нибудь помочь мне это исправить?

1 Ответ

0 голосов
/ 15 января 2019

Я исправил проблему. Проблема с функцией zip, которая по некоторым причинам не работает должным образом на моем сервере. Решение состоит в том, чтобы напрямую использовать функцию system2 (которая вызывается внутри zip).

Вместо

zip(file,files) 

Я должен использовать:

system2("zip", args=(paste(file,files,sep=" ")))
...