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

如何在R Shiny应用中将临时文件按指定名称打包为Zip?

解决Shiny中临时文件打包Zip时指定文件名的问题

方案1:正确使用zip::zipr的命名向量

确保命名向量的名称为Zip内要显示的文件名,值为本地临时文件路径,这是zipr的标准用法,调整代码如下:

library(zip)

filex <- 'file.csv'
file <- tempfile(fileext = ".csv")
write.csv(mtcars, file)

zip_file <- tempfile(fileext = ".zip")
# 构建命名向量:名称是目标文件名,值是源临时文件路径
zip::zipr(zip_file, files = setNames(file, filex))
# 验证打包后的文件名
print(utils::unzip(zip_file, list = TRUE))

若此方法无效,检查并更新zip包到最新版本:install.packages("zip")

方案2:临时子目录中转(稳定适配所有环境)

通过在临时目录下创建子文件夹,复制并重命名临时文件后再打包,彻底规避临时文件命名限制:

library(zip)

filex <- 'file.csv'
file <- tempfile(fileext = ".csv")
write.csv(mtcars, file)

# 创建临时子目录
sub_temp_dir <- file.path(tempdir(), "zip_temp")
dir.create(sub_temp_dir, recursive = TRUE, showWarnings = FALSE)

# 复制临时文件到子目录并重命名
target_path <- file.path(sub_temp_dir, filex)
file.copy(file, target_path, overwrite = TRUE)

# 打包子目录内的文件(不包含子目录本身)
zip_file <- tempfile(fileext = ".zip")
zip::zipr(zip_file, files = sub_temp_dir, recurse = TRUE, include_dirs = FALSE)

# 验证结果
print(utils::unzip(zip_file, list = TRUE))

# Shiny下载示例
# output$download_zip <- downloadHandler(
#   filename = function() "custom_name.zip",
#   content = function(file) {
#     file.copy(zip_file, file)
#   }
# )

方案3:使用archive包直接指定文件名

如果之前尝试archive包未成功,使用以下正确写法:

library(archive)

filex <- 'file.csv'
file <- tempfile(fileext = ".csv")
write.csv(mtcars, file)

zip_file <- tempfile(fileext = ".zip")
# 直接指定归档内的文件名
archive_write_files(zip_file, file, names = filex)

# 验证
print(utils::unzip(zip_file, list = TRUE))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:02:47