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

使用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接口获取。

修改步骤

  1. 在propFind请求中新增{http://nextcloud.org/ns}direct-link属性,获取Nextcloud生成的公开访问链接;
  2. 遍历结果时跳过目录自身的属性(深度为1时会返回目录本身);
  3. 用获取到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:13:17