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

如何通过Sabre PHP WebDAV客户端上传大文件至指定目录?

Sabre WebDAV上传Nextcloud问题解决方案

针对你遇到的含空格文件名报错、路径NotFound、大文件上传这几个问题,直接给解决方法:

1. 含空格文件名的URL编码处理

带空格的文件名必须手动URL编码,Sabre不会自动处理路径中的特殊字符:

// 本地文件名
$localFileName = 'A87J8HRS1 - simple pdf.pdf';
// 编码后的远程文件名
$encodedFileName = rawurlencode($localFileName);

2. 路径错误修正

确认客户端BaseUri

初始化Sabre客户端时,baseUri必须指向你的Nextcloud用户文件根目录,格式为:

$client = new Sabre\DAV\Client([
    'baseUri' => 'https://cd.wedos.com/remote.php/dav/files/你的用户名/',
    'userName' => '你的账号',
    'password' => '你的密码',
]);

正确使用相对路径

上传时用相对路径(不要加开头斜杠),比如上传到已存在的upload目录,路径应为"upload/{$encodedFileName}",而非"/upload/..."(开头斜杠会触发绝对路径,超出用户权限范围)。如果upload目录不存在,先创建:

$client->request('MKCOL', 'upload');

3. 2GB+大文件上传方案

绝对不能用file_get_contents读取整个大文件(会直接撑爆内存),改用文件流分块上传:

$localFilePath = '/path/to/your/large/file.pdf';
$remotePath = "upload/{$encodedFileName}";

// 以只读二进制模式打开文件流
$fileStream = fopen($localFilePath, 'rb');
if (!$fileStream) {
    exit('无法读取本地大文件');
}

// 发送PUT请求,传递文件流作为请求体
$response = $client->request(
    'PUT',
    $remotePath,
    $fileStream,
    ['Content-Type' => 'application/pdf'] // 根据文件类型设置对应MIME类型
);

fclose($fileStream);

// 验证上传结果
if (in_array($response->getStatus(), [201, 204])) {
    echo '大文件上传成功';
} else {
    echo "上传失败,状态码:{$response->getStatus()}\n";
    echo "响应详情:{$response->getBodyAsString()}";
}

额外配置提醒

  • 调整PHP配置:修改php.ini中的memory_limit(建议设为-1或足够大的值)、max_execution_time(建议设为300以上),避免超时或内存不足
  • 无需额外配置Nextcloud分块上传:Sabre客户端会自动适配Nextcloud的分块机制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:23:11