You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:32:55