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

PHP调用AWS WorkDocs API上传文件遇连接超时错误求助

解决PHP通过WorkDocs API上传文件时的超时问题

核心问题分析

你的代码存在cURL选项冲突:同时启用了CURLOPT_PUT+CURLOPT_INFILE(用于PUT方式上传文件)和CURLOPT_POSTFIELDS(用于POST请求传递数据),这会导致cURL无法正确处理请求,服务器因长时间未收到有效数据而触发超时关闭连接。另外,你遗漏了initiateDocumentVersionUpload返回的签名相关HTTP头,这也会导致请求验证失败或无响应。

修复步骤及代码

  1. 移除冲突的CURLOPT_POSTFIELDS设置:PUT上传文件时,仅通过CURLOPT_INFILE传递文件内容即可。
  2. 添加UploadMetadata返回的所有HTTP头:WorkDocs的上传URL需要携带签名相关头,不能只自定义Content-Type和加密头。
  3. 添加超时设置(可选但推荐):避免因网络波动导致无意义的等待。
  4. 确保文件句柄正确关闭:上传完成后关闭文件资源。

修正后的完整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:57:27