在R中从NAS的WebDAV服务器读取Excel文件失败,求解决方法
解决R连接WebDAV下载Excel文件失败的问题
问题分析
你遇到的两个版本问题本质都是二进制文件处理不当或认证类型不匹配:
- 版本1中
content(df)默认尝试解析响应内容,但Excel是二进制格式,返回的raw其实是正确的文件二进制数据,只是未保存到磁盘。 - 版本2中文件下载后损坏,大概率是认证方式未匹配NAS WebDAV的要求,导致实际下载的是错误内容(如未授权页面),而非真实Excel文件;同时代码中的变量赋值逻辑容易混淆。
修正方案
方案1:修正下载+读取流程(推荐)
明确指定认证类型(根据NAS WebDAV设置选择basic或digest),正确保存二进制文件后读取:
library(httr) library(readxl) # 定义临时文件路径 tmp_excel <- "tmp.xlsx" # 发送GET请求,指定正确的认证类型 response <- GET( url = "https://my/file/path.xlsx", authenticate(user = "my_user", password = "my_pw", type = "digest"), # 若basic有效则替换为"basic" write_disk(path = tmp_excel, overwrite = TRUE), add_headers(Accept = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") ) # 检查请求是否成功(非200状态则抛出错误) stop_for_status(response) # 读取Excel文件 df <- read_excel(tmp_excel, sheet = 1) print(df)
方案2:直接处理raw数据保存文件
如果版本1的连接能成功获取raw数据,可以直接将二进制内容写入磁盘后读取:
library(httr) library(readxl) response <- GET( url = "https://my/file/path.xlsx", authenticate(user = "my_user", password = "my_pw", type = "digest") ) # 将raw二进制数据写入文件 writeBin(content(response, as = "raw"), "tmp.xlsx") # 读取文件 df <- read_excel("tmp.xlsx", sheet = 1) print(df)
关键注意事项
- 认证类型:不要用
type = "any",手动指定"basic"或"digest"——多数NAS WebDAV默认使用digest认证,若basic无效再切换。 - 变量赋值:避免在
write_disk中直接赋值变量,分开定义文件路径更清晰,防止混淆响应对象和文件路径。 - 响应校验:用
stop_for_status(response)确保请求返回200成功状态,避免下载错误内容却不知情。
内容的提问来源于stack exchange,提问作者ATellB
相关产品推荐
相关产品推荐

