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

R Shiny应用调用drop_download拉取Dropbox数据触发HTTP 409冲突错误

R Shiny 结合rdrop2实现Dropbox下载报HTTP 409错误解决方案

报错现象

执行Dropbox数据下载操作时抛出错误:

Downloading: 87 B     Warning: Error in drop_download: Conflict (HTTP 409).
156: <Anonymous>

已验证排查前提:Dropbox授权流程无异常,同授权凭证下的文件上传功能完全正常,仅下载类操作触发报错。

问题根因

代码运行时存在三类可触发HTTP 409冲突的逻辑问题:

  • f_loadData函数中subset的文件匹配逻辑错误:代码写为subset(drop_dir(outputDir), name=filename),属于赋值操作而非相等判断,筛选出的文件路径不符合预期,易导致请求的Dropbox资源不存在
  • rdrop2的drop_read_csv底层依赖drop_download实现文件拉取,该函数默认不允许覆盖本地临时目录中已存在的同名文件。当应用临时目录tempdir()残留上次运行遗留的同名文件时,Dropbox API会判定请求存在资源冲突,返回409状态码
  • f_saveData函数中sprintf的格式化逻辑不匹配:代码预留了时间戳、文件哈希两个格式化占位符,但传入的文件名模板"name_of_file.csv"没有任何占位符,导致每次上传的文件名完全固定,重复上传、下载时的同名冲突概率大幅提升

修复方案

  1. 修正文件匹配逻辑:把subset中的赋值判断改为相等判断,确保准确匹配Dropbox目标文件夹下的对应文件
  2. 给下载操作显式开启覆盖权限:调用drop_read_csv时传入overwrite = TRUE参数,绕过本地残留文件的冲突判定
  3. 统一文件名生成逻辑:匹配sprintf的占位符数量与传入的文件名模板格式,避免文件名生成失效

修正后的核心代码片段

token <- readRDS("my-token.rds")
outputDir <- "Ed_app_save"

f_saveData <- function(data, name1) {
  data <- t(data)
  # 需确保name1模板和sprintf占位符匹配,例如传入:"data_%d_%s.csv"
  fileName <- sprintf(name1, as.integer(Sys.time()), digest::digest(data))
  filePath <- file.path(tempdir(), fileName)
  write.csv(data, filePath, row.names = FALSE, quote = TRUE)
  drop_upload(filePath, path = outputDir, dtoken = token)
}

f_loadData <- function(filename) {
  # 修正:将name=filename改为相等判断
  filesInfo <- subset(drop_dir(outputDir), name == filename)
  filePaths <- filesInfo$path_display
  # 修正:下载时允许覆盖本地残留文件
  data <- lapply(filePaths, function(file_path) {
    drop_read_csv(
      file_path, 
      dtoken = token, 
      stringsAsFactors = FALSE, 
      overwrite = TRUE
    )
  })
  data
}

补充兜底优化

如果修正后仍偶发409报错,可在下载前主动清理临时目录下的同名残留文件,从根源上避免冲突:

# 在调用drop_read_csv前执行
unlink(file.path(tempdir(), filename))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 10:45:05