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

R Shiny应用本地文件上传正常,部署至shinyapps.io后失效求助

问题原因分析

你的代码在本地正常但在shinyapps.io上失效,核心原因有两点:

  1. shinyapps.io的文件系统是临时且隔离的:每个用户会话拥有独立的临时存储,会话结束或应用重启后,所有运行时生成的文件会被自动清理,无法持久化。
  2. 应用包是静态资源集合:你下载的应用包是部署时上传的代码和静态文件,不包含运行时用户上传的动态文件,所以自然找不到这些文件。
解决方案

根据你的需求,提供两种针对性方案:

方案1:仅在当前会话内使用上传文件(无需持久化)

不需要复制文件到本地目录,直接使用input$file1提供的临时路径和文件名即可,这样既避免了文件存储问题,又能在会话有效期内正常处理文件。修改后的代码如下:

library(shiny) 

ui <- shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Select file to upload' )  
    ),
    mainPanel(
      h4('Uploaded file details:'),
      verbatimTextOutput('fileInfo')
    )
  ))
)

server <- shinyServer(function(input, output) {
  output$fileInfo <- renderText({  
    if (is.null(input$file1)) {
      "No file uploaded yet"
    } else {
      paste0("Filename: ", input$file1$name, "\nTemporary path: ", input$file1$datapath)
    }
  })
  
  # 示例:读取上传的文件(以CSV为例)
  observe({
    if (!is.null(input$file1)) {
      # df <- read.csv(input$file1$datapath)
      # 在这里添加你的文件处理逻辑
    }
  })
})

shinyApp(ui, server)

方案2:持久化保存上传文件(供后续会话访问)

如果你需要让上传的文件被后续用户会话访问,需要使用shinyapps.io支持的持久化存储目录(~/目录,内容会在应用重启后保留)。修改后的代码如下:

library(shiny) 

ui <- shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Select file to upload' )  
    ),
    mainPanel(
      h4('List of uploaded files:'),
      verbatimTextOutput('fileList')
    )
  ))
)

server <- shinyServer(function(input, output) {
  # 定义持久化存储目录
  persist_dir <- "~/uploaded_files"
  # 自动创建目录(如果不存在)
  if (!dir.exists(persist_dir)) {
    dir.create(persist_dir, recursive = TRUE)
  }
  
  observe({  
    if (is.null(input$file1)) return(NULL)  
    # 复制文件到持久化目录
    dest_path <- file.path(persist_dir, paste0('userFile_', input$file1$name))
    file.copy(from = input$file1$datapath, to = dest_path, overwrite = TRUE)
  }) 
  
  output$fileList <- renderText({  
    input$file1 # 触发输出更新
    list.files(persist_dir, pattern = 'userFile_') 
  })
})

shinyApp(ui, server)

注意事项

即使使用持久化存储,这些运行时上传的文件也不会被包含在你下载的应用包中。如果需要获取这些文件,可以使用rsconnect包从shinyapps.io服务器下载:

library(rsconnect)
# 替换为你的应用名称
app_name <- "your-app-name"
# 下载持久化目录的文件到本地
rsconnect::downloadApp(app_name, destDir = "./local-download", includeFiles = "~/uploaded_files")

内容的提问来源于stack exchange,提问作者Levis Ogoro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:37:46