如何用R高效下载SharePoint多文件?已遇文件损坏问题
问题根源
你下载的"损坏文件"实际是SharePoint的登录跳转页面(HTML内容),而非目标文档——普通GET请求没有携带你的认证凭据,无法访问需要权限的内部文件,只有公开文件能直接下载。
方案1:用azuregraph获取Azure AD认证令牌(企业版SharePoint通用)
适用于基于Azure AD认证的企业SharePoint站点,步骤清晰稳定:
- 安装并加载依赖包:
install.packages(c("azuregraph", "httr", "readxl")) library(azuregraph) library(httr) library(readxl)
- 完成双因素认证并获取站点令牌:
# 弹出浏览器,用你的工作/学校账户完成双因素登录 tenant <- get_azure_tenant() site <- get_sharepoint_site("https://你的SharePoint站点根URL", tenant = tenant) # 提取访问令牌 token <- site$token$credentials$access_token
- 批量下载文件:
data <- read_excel("data/in/doclist.xlsx") urls <- data$url for (url in urls) { # 携带认证头发起请求 response <- GET( url, add_headers(Authorization = paste("Bearer", token)) ) # 跳过请求失败的文件 if (status_code(response) != 200) { cat("下载失败:", url, ",状态码:", status_code(response), "\n") next } file_name <- basename(url) save_path <- paste0("data/out/", file_name) # 写入二进制文件内容 writeBin(content(response, "raw"), save_path) cat("文件", file_name, "下载成功\n") }
方案2:利用浏览器Cookie快速认证(零额外配置)
如果你已经在浏览器登录过SharePoint,直接导出Cookie就能让R借助curl完成下载:
- 导出浏览器Cookie:
- Chrome:安装
Get Cookies.txt LOCALLY插件,打开任意SharePoint页面,导出Cookie为cookies.txt,放到R项目根目录。 - Firefox:用
Export Cookies插件,导出格式选Netscape。
- R中调用
curl批量下载:
library(readxl) data <- read_excel("data/in/doclist.xlsx") urls <- data$url for (url in urls) { file_name <- basename(url) save_path <- paste0("data/out/", file_name) # 构造curl命令:加载Cookie、跟随重定向、保存文件 cmd <- paste0( 'curl -L -b "cookies.txt" -o "', save_path, '" "', url, '"' ) # 执行下载命令 system(cmd) cat("文件", file_name, "处理完成\n") }
方案3:用sharepointr包(SharePoint专属工具)
这个包封装了SharePoint API操作,代码更简洁:
- 安装并加载包:
devtools::install_github("christopherkenny/sharepointr") library(sharepointr) library(readxl)
- 认证并批量下载:
# 弹出浏览器完成双因素登录 sp_auth("https://你的SharePoint站点根URL") data <- read_excel("data/in/doclist.xlsx") for (i in 1:nrow(data)) { url <- data$url[i] # 提取文件的站点相对路径(也可直接用完整URL传入sp_download) file_path <- sub("https://你的SharePoint站点根URL/", "", url) sp_download(file_path, dest = paste0("data/out/", basename(url))) cat("文件", basename(url), "下载成功\n") }
验证小技巧
下载后检查文件大小:如果文件只有几KB,说明还是下载了登录页面,需要重新检查认证步骤;正常文档大小应该和网页上显示的一致。
内容的提问来源于stack exchange,提问作者ezrarusk
相关产品推荐
相关产品推荐

