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

如何用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协议获取文件列表,再转换为可直接下载的链接:

  1. 安装并加载依赖包
install.packages(c("httr", "xml2", "fs"))
library(httr)
library(xml2)
library(fs)
  1. 获取文件夹内所有文件的下载链接
# 替换为你的文件夹令牌
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")
  1. 批量下载文件到本地
# 创建本地存储目录
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:14:54