Symfony应用上传文件至映射网络驱动器遇404错误求助
解决Symfony中WebDAV上传OneDrive返回404的问题
核心问题分析
- Write方法路径错误:你已在
Client的baseUri中指定OneDrive的WebDAV根地址,但调用filesystem->write()时又传入完整URL,导致最终请求路径变为https://d.docs.live.net/6A3F6B58197AC1EC/https://d.docs.live.net/6A3F6B58197AC1EC/file.txt,属于无效路径直接触发404。 - 认证方式过时:当前OneDrive不再支持用户名密码的WebDAV基本认证,必须使用OAuth2令牌,传统认证会导致权限验证失败,服务器常返回404混淆实际问题。
修复步骤
1. 修正Write方法的路径
将write的第一个参数改为相对路径,由WebDAVAdapter自动拼接baseUri:
try { $filesystem->write("file.txt", "I am a boy"); } catch (FilesystemException | UnableToReadFile $exception) { dd($exception); }
2. 替换为OAuth2认证
第一步:获取OAuth2访问令牌
需通过Microsoft Graph API完成授权流程:
- 在Azure门户注册应用,获取客户端ID和密钥
- 引导用户授权获取授权码
- 用授权码换取访问令牌和刷新令牌
第二步:配置客户端认证
用OAuth2令牌替换原用户名密码配置:
$client = new Client([ 'baseUri' => "https://d.docs.live.net/6A3F6B58197AC1EC/", 'headers' => [ 'Authorization' => 'Bearer ' . $accessToken, // 替换为实际访问令牌 ], ]);
3. 验证WebDAV端点正确性
个人OneDrive的WebDAV地址格式为https://d.docs.live.net/<你的OneDrive ID>/,可通过Microsoft Graph API的/me/drive端点获取webDavUrl字段确认准确地址。
额外注意事项
- 确保Azure应用已申请
Files.ReadWrite等OneDrive操作权限 - 令牌过期后需用刷新令牌重新获取新令牌
- 可先用curl命令验证WebDAV连接有效性:
curl -X PUT -H "Authorization: Bearer <access-token>" -d "test content" https://d.docs.live.net/6A3F6B58197AC1EC/test.txt
内容的提问来源于stack exchange,提问作者Ben Josiah
相关产品推荐
相关产品推荐

