如何通过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
相关产品推荐
相关产品推荐

