如何用R访问并下载ownCloud公共文件夹中的批量文件
我在ownCloud上有一个包含5000多个文件的公共文件夹,需要用R(所有合作者都在用的工具)逐个访问这些文件,但没有单个文件的分享令牌。我想实现类似list.files的功能来列出目录文件,再批量处理。
之前尝试相关方法时出现错误:
Error: [rast] file does not exist: https://owncloud.gwdg.de/remote.php/dav/public-files/JRXVRDvnWwntQbO/u_component_of_wind_2023_10_1.nc
In addition: Warning message:
In new_CppObject_xp(fields$.module,fields$.pointer, ...) :
GDAL Error 1: An error occurred while creating a virtual connection to the DAP server: Error while reading the URL: https://owncloud.gwdg.de/remote.php/dav/public-files/JRXVRDvnWwntQbO/u_component_of_wind_2023_10_1.nc.ver.The OPeNDAP server returned the following message:
Not Found: The datasource or server could not be found. Often this means that the OPeNDAP server is missing or needs attention. Please contact the server administrator.
但单独分享某个文件时,用以下代码能正常访问:
rast("https://owncloud.gwdg.de/index.php/s/Oj2chbdlryN1vXR/download")
请问如何用R下载这个共享ownCloud文件夹中的所有文件?
方法1:基于WebDAV接口手动遍历下载
ownCloud公共文件夹的WebDAV路径里已经包含了文件夹令牌(即错误信息中的JRXVRDvnWwntQbO),可以通过WebDAV协议获取文件列表,再转换为可直接下载的链接:
- 安装并加载依赖包
install.packages(c("httr", "xml2", "fs")) library(httr) library(xml2) library(fs)
- 获取文件夹内所有文件的下载链接
# 替换为你的文件夹令牌 folder_token <- "JRXVRDvnWwntQbO" base_webdav_url <- paste0("https://owncloud.gwdg.de/remote.php/dav/public-files/", folder_token, "/") # 发送PROPFIND请求获取文件结构 response <- PROPFIND(base_webdav_url, config = config(followlocation = TRUE)) content_xml <- content(response, as = "parsed") # 提取所有文件的WebDAV路径并转换为下载链接 file_paths <- xml_text(xml_find_all(content_xml, ".//d:href")) # 过滤掉文件夹自身的路径,只保留文件 file_paths <- file_paths[!file_paths == base_webdav_url] # 将WebDAV路径转换为带/download后缀的可直接访问链接 download_urls <- gsub("/remote.php/dav/public-files/", "/index.php/s/", file_paths) download_urls <- paste0(download_urls, "/download")
- 批量下载文件到本地
# 创建本地存储目录 local_dir <- "owncloud_files" dir_create(local_dir) # 循环下载每个文件 for (url in download_urls) { file_name <- path_file(url) local_path <- path(local_dir, file_name) GET(url, write_disk(local_path, overwrite = TRUE)) cat("已完成:", file_name, "\n") }
方法2:使用owncloudR包简化操作
如果你的ownCloud服务器支持,owncloudR包可以更便捷地完成批量操作:
install.packages("owncloudR") library(owncloudR) # 连接到公共文件夹 oc_connect(public_link = base_webdav_url) # 获取文件列表 file_list <- oc_list_files() # 批量下载到指定目录 oc_download_files(file_list$path, destdir = local_dir)
关键说明
- 之前的错误原因:ownCloud公共文件夹的WebDAV接口不支持GDAL的DAP协议直接读取,必须使用带
/download后缀的单个文件分享链接才能正常访问。 - 批量下载大文件时,建议添加错误重试机制,比如用
purrr::possibly包装下载函数,避免因网络波动中断流程。
内容的提问来源于stack exchange,提问作者Tess H

