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

使用Sardine上传至Nextcloud返回501 Not Implemented问题求助

使用Sardine WebDAV客户端向Nextcloud上传文件时遇到501 Not Implemented异常

问题场景

我尝试用Java的Sardine WebDAV客户端向Nextcloud上传文件,代码如下:

sardine.put(config.getUrl() + remotePath, file.getInputStream());

其中config.getUrl()的配置为:

http://localhost:8090/remote.php/dav/files/admin/

出现的异常

com.github.sardine.impl.SardineException: Unexpected response (501 Not Implemented)

可正常运行的操作

用相同凭证和路径执行curl命令能成功上传:

curl -u admin:your_app_password -T file.pdf "http://localhost:8090/remote.php/dav/files/admin/OpportunitesCommerciales/5/ADMINISTRATIF/Ahmed-attestation.pdf"

已尝试的操作

  • 确认基础WebDAV URL(/remote.php/dav/files/admin/)正确
  • 尝试使用/remote.php/webdav/作为基础路径
  • 手动在Nextcloud中创建目录结构
  • 确认文件流和凭证正常
  • 使用curl测试相同URL和文件,可成功上传

疑问

  1. 为何同一端点下curl可正常上传,但Sardine返回501 Not Implemented?
  2. 具体是哪部分未实现——是否是Sardine的PUT请求存在问题?
  3. 如何正确配置Sardine以适配Nextcloud?
  4. 是否有特定版本的Sardine可与Nextcloud WebDAV兼容?
  5. 是否应考虑使用其他已知兼容的Java WebDAV客户端?

解答

1. 为何curl正常但Sardine返回501?

核心原因是Sardine默认发送的PUT请求可能携带了Nextcloud不支持的WebDAV扩展头或请求参数,比如Sardine可能会在PUT时添加Overwrite头的特殊取值,或者尝试启用某些Nextcloud未实现的WebDAV特性(比如锁定、版本控制相关的扩展)。而curl的PUT请求是极简的,只携带必要的HTTP头,完全符合Nextcloud对标准WebDAV PUT的支持。

2. 哪部分未实现?

不是Sardine的PUT请求本身有问题,而是Sardine默认启用的某些WebDAV扩展特性Nextcloud未实现。比如Sardine可能会在请求中包含Depth头、If头的复杂条件,或者尝试使用PUT请求的非标准变体,导致Nextcloud返回501表示不支持该扩展操作。

3. 正确配置Sardine适配Nextcloud的方法

  • 禁用不必要的WebDAV扩展:初始化Sardine时,关闭扩展特性,强制使用标准WebDAV协议:
    Sardine sardine = SardineFactory.begin("admin", "your_app_password");
    // 禁用分块编码,关闭扩展特性
    sardine.setUseChunkedEncoding(false);
    sardine.setFollowRedirects(true);
    // 手动指定标准请求头,避免Sardine添加额外扩展头
    Map<String, String> headers = new HashMap<>();
    headers.put("Content-Type", "application/octet-stream");
    sardine.put(config.getUrl() + remotePath, file.getInputStream(), headers);
    
  • 检查路径拼接:确保config.getUrl() + remotePath的最终路径和curl使用的完全一致,避免末尾多斜杠或路径拼接错误(比如remotePath开头是否带斜杠导致出现//)。
  • 使用Nextcloud应用密码:用个人设置-安全中生成的应用密码替代用户密码,确保权限符合Nextcloud的安全要求。

4. 兼容Nextcloud的Sardine版本

目前已知Sardine 5.x版本(如5.1.0)对Nextcloud的兼容性较好,避免使用3.x及更早的旧版本——旧版本的WebDAV扩展逻辑更激进,容易触发Nextcloud的不支持特性。可以在pom.xml中指定依赖:

<dependency>
    <groupId>com.github.lookfirst</groupId>
    <artifactId>sardine</artifactId>
    <version>5.1.0</version>
</dependency>

5. 替代的Java WebDAV客户端

如果Sardine仍有兼容性问题,可以考虑以下成熟的客户端:

  • Apache Jackrabbit WebDAV Client:Apache官方的WebDAV实现,兼容性强,完全支持标准WebDAV协议,适配Nextcloud无压力。
  • OkHttp自定义请求:用OkHttp发送标准PUT请求,完全自定义请求头和参数,灵活性最高,适合简单上传场景。
  • SimpleWebDAV:轻量级WebDAV客户端,专注于标准操作,无多余扩展,适配Nextcloud这类标准WebDAV服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:48:09