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

使用Autodesk Data Management API上传文件时签名URL上传失败

问题分析与解决

你遇到的MissingOrInvalidParts错误,核心原因是上传请求的格式和方式不符合S3签名URL的要求,结合你的代码来看,存在几个关键问题:

  1. 请求方式冲突:同时设置了CURLOPT_PUT和CURLOPT_POSTFIELDS,PUT请求不需要构造表单数据,直接传递文件内容即可。
  2. 多余的请求头:签名URL已经包含了AWS认证信息,不需要添加Authorization: Bearer头,这会干扰S3的验证逻辑。
  3. 错误的上传格式: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:57:00