使用sabre/dav获取Nextcloud文件列表,无法生成有效下载链接求助
问题:Nextcloud + sabre/dav 生成可下载文件链接失败
我使用PHP库sabre/dav对接自有Nextcloud,已成功遍历文件及文件夹列表,但生成的下载链接点击后浏览器返回JSON错误:error: "Strict Cookie has not been found in request",不清楚正确的下载URL格式。
当前生成的链接示例:https://mynextcloud.com/remote.php/dav/files/SHARED-MEDIA/sound.mp3
附上相关代码:
$settings = array( 'baseUri' => 'https://nextcloud.example.com/remote.php/dav', 'userName' => '*********', 'password' => '*********' ); $client = new Sabre\DAV\Client($settings); $directory = 'files/SHARED-MEDIA'; try { $result = $client->propFind($directory, [ '{DAV:}displayname', '{DAV:}getlastmodified', ], 1); echo "<ul>"; // Start an unordered list foreach ($result as $file) { $name = $file['{DAV:}displayname']; $url = $settings['baseUri'] . "/" . $directory . "/" . urlencode($name); echo "<li>$name <a href='$url'>Download</a>"; if (str_contains($name, '.mp3')) { echo " <audio controls><source src='$url' type='audio/mpeg'></audio>"; } echo "</li>"; } echo "</ul>"; } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); }
解决方案
问题原因
你直接拼接的WebDAV接口链接需要后端认证(代码中用用户名密码完成),但前端浏览器访问时未携带认证信息,因此触发Strict Cookie错误。Nextcloud提供了无需额外认证的直接访问链接,需通过WebDAV接口获取。
修改步骤
- 在
propFind请求中新增{http://nextcloud.org/ns}direct-link属性,获取Nextcloud生成的公开访问链接; - 遍历结果时跳过目录自身的属性(深度为1时会返回目录本身);
- 用获取到的
direct-link替换手动拼接的WebDAV地址。
修改后的代码
$settings = array( 'baseUri' => 'https://nextcloud.example.com/remote.php/dav', 'userName' => '*********', 'password' => '*********' ); $client = new Sabre\DAV\Client($settings); $directory = 'files/SHARED-MEDIA'; try { $result = $client->propFind($directory, [ '{DAV:}displayname', '{DAV:}getlastmodified', '{http://nextcloud.org/ns}direct-link' // 新增获取直接访问链接的属性 ], 1); echo "<ul>"; foreach ($result as $path => $file) { // 跳过目录自身的属性条目 if ($path === $directory) continue; $name = $file['{DAV:}displayname']; $directLink = $file['{http://nextcloud.org/ns}direct-link']; echo "<li>$name <a href='$directLink' target='_blank'>Download</a>"; if (str_contains($name, '.mp3')) { echo " <audio controls><source src='$directLink' type='audio/mpeg'></audio>"; } echo "</li>"; } echo "</ul>"; } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); }
额外说明
direct-link是带临时签名的公开链接,默认有效期1小时,可在Nextcloud后台调整或通过API指定有效期;- 确保目标文件夹/文件的共享权限允许下载/查看,否则链接会失效;
- 若需永久链接,可考虑使用Nextcloud的公开共享功能,通过API获取共享链接。
内容的提问来源于stack exchange,提问作者1213
相关产品推荐
相关产品推荐

