使用Autodesk Data Management API上传文件时签名URL上传失败
问题分析与解决
你遇到的MissingOrInvalidParts错误,核心原因是上传请求的格式和方式不符合S3签名URL的要求,结合你的代码来看,存在几个关键问题:
- 请求方式冲突:同时设置了
CURLOPT_PUT和CURLOPT_POSTFIELDS,PUT请求不需要构造表单数据,直接传递文件内容即可。 - 多余的请求头:签名URL已经包含了AWS认证信息,不需要添加
Authorization: Bearer头,这会干扰S3的验证逻辑。 - 错误的上传格式:S3签名URL要求直接PUT文件原始内容,而非用
multipart/form-data表单提交。
修正后的上传代码
public static function uploaditem($path_to_upload, $signed_url) { $file_handle = fopen($path_to_upload, 'rb'); if (!$file_handle) { return false; } $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $signed_url); curl_setopt($curl, CURLOPT_PUT, true); curl_setopt($curl, CURLOPT_INFILE, $file_handle); curl_setopt($curl, CURLOPT_INFILESIZE, filesize($path_to_upload)); // 测试环境可临时禁用SSL验证,生产环境建议开启 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); fclose($file_handle); curl_close($curl); // 通过HTTP状态码判断上传结果 if ($http_code >= 200 && $http_code < 300) { return $response; } else { return ['http_code' => $http_code, 'response' => $response]; } }
关键修改说明
- 移除冗余请求头:不再传递
Authorization和Content-Type,签名URL已包含验证所需信息,S3会自动处理内容类型识别。 - 规范PUT请求:通过
CURLOPT_INFILE和CURLOPT_INFILESIZE直接传递文件流,完全符合S3签名URL的上传要求。 - 增加状态码校验:通过HTTP状态码直观判断上传是否成功,便于调试排查。
- 简化参数传递:无需再传入
token、bucket_key和object_id,直接使用获取到的签名URL即可。
使用示例
调用时传入本地文件路径和测试数据中的签名URL(即urls[0]对应的值):
$signed_url = "你的签名URL"; $upload_result = uploaditem('/path/to/your/file.png', $signed_url); var_dump($upload_result);
内容的提问来源于stack exchange,提问作者jian zhang
相关产品推荐
相关产品推荐

