使用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和文件,可成功上传
疑问
- 为何同一端点下curl可正常上传,但Sardine返回501 Not Implemented?
- 具体是哪部分未实现——是否是Sardine的PUT请求存在问题?
- 如何正确配置Sardine以适配Nextcloud?
- 是否有特定版本的Sardine可与Nextcloud WebDAV兼容?
- 是否应考虑使用其他已知兼容的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
相关产品推荐
相关产品推荐

