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

Python Shiny Express应用上传文件存储位置及自定义路径问题

Python Shiny Express 文件上传存储问题解答

1. 上传文件的默认存储位置

Shiny Express 默认会把上传的文件临时存储在系统临时目录:Linux/macOS 下是 /tmp,Windows 则是C:\Users\<用户名>\AppData\Local\Temp这类路径。这些临时文件会在会话结束后自动清理,且临时目录不在你的 Git 仓库范围内,所以你查看 Git 日志看不到变化。

2. 你的代码存在的问题

  • 未判断用户是否上传文件:当用户还没选择文件时,input.file1() 返回 None,直接访问 file[0]["datapath"] 会报错,这也是你说“调用 datapath 无返回内容”的原因之一。
  • 未主动复制文件到自定义路径:Shiny 不会自动把临时文件转移到你指定的目录,你只是打开临时文件,没有执行写入自定义路径的操作,所以文件不会出现在./data/results/下。

3. 修改文件存储位置的方法

要将上传文件保存到自定义目录,需要手动把临时文件复制到目标路径,步骤如下:

步骤1:确保目标目录存在

先检查并创建存储目录,避免因目录不存在导致写入失败。

步骤2:复制临时文件到自定义路径

在响应式函数中,判断用户已上传文件后,将临时文件复制到目标位置。

修正后的完整代码:

from shiny import reactive
from shiny.express import input, render, ui
from shiny.types import FileInfo
from pathlib import Path
import shutil

# 初始化目标存储目录(不存在则创建)
target_dir = Path(__file__).parent / "data/results"
target_dir.mkdir(parents=True, exist_ok=True)

ui.input_file("file1", "请选择要上传的文件", accept=['.csv'], multiple=False)

@reactive.calc
def parsed_file():
    file: list[FileInfo] | None = input.file1()
    if not file:
        return None  # 用户未上传文件时返回空值
    
    # 获取临时文件路径与原始文件名
    temp_file_path = file[0]["datapath"]
    original_name = file[0]["name"]
    save_path = target_dir / original_name
    
    # 复制临时文件到自定义目录
    shutil.copy(temp_file_path, save_path)
    
    # 读取文件内容(按需执行)
    with open(save_path, "r", encoding="utf-8") as f:
        content = f.read()
        print(content)
    return content

4. 关键注意事项

  • datapath 仅在用户成功上传文件后才有值,必须先判断 input.file1() 非空再访问。
  • 临时文件会被 Shiny 自动清理,务必在会话有效期内完成文件复制操作。
  • 若需长期保留上传文件,必须手动复制到自定义目录,不要依赖临时文件路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:33:14