如何在Shiny App中读取用户上传ZIP内的JSON文件而无需解压到本地
问题解决:Shiny读取上传ZIP文件报错"No such file or directory"
问题根源
你的代码仅通过unzip(d$datapath, list = T)获取了压缩包内的文件列表,但并未将文件实际解压到可访问的本地路径。直接用read_json读取这些相对文件名时,系统找不到对应的文件——因为它们还存放在压缩包内部,不是独立的本地文件。R 4.3.2版本更新不是导致该问题的原因,核心是代码逻辑缺失了解压步骤。
修复方案
使用base R的unzip函数将上传的ZIP文件解压到Shiny的临时目录(tempdir()),然后拼接完整的文件路径进行读取,无需额外安装解压包。修改后的代码如下:
library(shiny) library(purrr) library(jsonlite) ui <- fluidPage( fileInput("site", "Upload", accept = "zip", placeholder = "upload zip"), tableOutput("check") ) server <- function(input, output, session) { files <- reactive({ d <- req(input$site) # 将ZIP文件解压到临时目录 unzip(d$datapath, exdir = tempdir()) # 获取解压后的完整文件路径 u <- unzip(d$datapath, list = TRUE) full_paths <- file.path(tempdir(), u$Name) # 读取所有JSON文件 data <- purrr::map(full_paths, jsonlite::read_json) data }) output$check <- renderTable(files()) } shinyApp(ui, server)
关键说明
tempdir()是Shiny自动管理的临时目录,会在会话结束后自动清理,无需手动处理文件残留- 拼接
full_paths时必须使用file.path()保证跨平台路径格式正确 - base R的
unzip完全满足需求,不需要额外安装第三方解压包
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

