PHP调用AWS WorkDocs API上传文件遇连接超时错误求助
解决PHP通过WorkDocs API上传文件时的超时问题
核心问题分析
你的代码存在cURL选项冲突:同时启用了CURLOPT_PUT+CURLOPT_INFILE(用于PUT方式上传文件)和CURLOPT_POSTFIELDS(用于POST请求传递数据),这会导致cURL无法正确处理请求,服务器因长时间未收到有效数据而触发超时关闭连接。另外,你遗漏了initiateDocumentVersionUpload返回的签名相关HTTP头,这也会导致请求验证失败或无响应。
修复步骤及代码
- 移除冲突的
CURLOPT_POSTFIELDS设置:PUT上传文件时,仅通过CURLOPT_INFILE传递文件内容即可。 - 添加
UploadMetadata返回的所有HTTP头:WorkDocs的上传URL需要携带签名相关头,不能只自定义Content-Type和加密头。 - 添加超时设置(可选但推荐):避免因网络波动导致无意义的等待。
- 确保文件句柄正确关闭:上传完成后关闭文件资源。
修正后的完整cURL代码:
// 文件路径 $filePath = 'C:/wamp64/www/test_aws/test-file.txt'; // 从initiateDocumentVersionUpload获取的完整UploadMetadata $uploadMetadata = $result->get('UploadMetadata'); $url = $uploadMetadata['UploadUrl']; // 提取所有需要的HTTP头 $headers = []; foreach ($uploadMetadata['Headers'] as $key => $value) { $headers[] = "$key: $value"; } // 补充加密头(如果UploadMetadata里没有的话) $headers[] = "x-amz-server-side-encryption: AES256"; // 初始化cURL $curl = curl_init($url); // 设置PUT请求 curl_setopt($curl, CURLOPT_PUT, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 设置文件句柄和大小 $fileHandle = fopen($filePath, 'r'); curl_setopt($curl, CURLOPT_INFILE, $fileHandle); curl_setopt($curl, CURLOPT_INFILESIZE, filesize($filePath)); // 设置HTTP头 curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 超时设置(单位:秒) curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 调试用(生产环境建议移除) curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 执行请求 $resp = curl_exec($curl); // 关闭资源 fclose($fileHandle); curl_close($curl); var_dump($resp);
额外说明
- 不要随意混合PUT和POST相关的cURL选项:PUT请求依赖文件句柄传递内容,POSTFIELDS会覆盖或干扰这一流程。
- 必须携带
UploadMetadata中的签名头:WorkDocs的预签名上传URL需要这些头来验证请求合法性,缺少会导致请求被拒绝或无响应。
内容的提问来源于stack exchange,提问作者Fitspade
相关产品推荐
相关产品推荐

