如何在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
相关产品推荐
相关产品推荐

