如何将指定curl请求转换为GuzzleHttp请求并解决上传报错问题
问题原因
你当前的代码存在三处核心错误:
- 原始curl请求采用
multipart/form-data表单格式提交数据,你使用Guzzle的json参数会发送application/json格式的请求,完全不匹配接口要求 - 你没有按接口要求单独提交文件字段,将文件路径写入JSON结构的传递方式无效,接口无法识别到上传的文件
- 接口要求的
Verb参数值为UploadModelRelease,你的代码里误写为UploadRelease
修正后的代码
$client = new \GuzzleHttp\Client(); // 构造Request字段的JSON内容 $requestData = json_encode([ 'APIRequests' => [ [ "Verb" => "UploadModelRelease", // 修正Verb参数值 "AuthToken" => $this->getAccessToken(), "FirstName" => $firstName, "LastName" => $lastName, "Gender" => $gender, "Country" => $country, "AgeGroup" => $ageGroup, "Ethnics" => $ethnics, ], ] ]); $response = $client->request('POST', "https://api2.dreamstime.com/api/", [ 'allow_redirects' => true, // 对应curl的-L参数,允许重定向 'multipart' => [ // 第一个表单字段:Request,值为JSON字符串 [ 'name' => 'Request', 'contents' => $requestData ], // 第二个表单字段:PropertyRelease,上传文件 [ 'name' => 'PropertyRelease', 'contents' => \GuzzleHttp\Psr7\Utils::tryFopen($file, 'r'), // $file为本地文件绝对路径 'filename' => basename($file) // 可选,指定上传的文件名 ] ] ]);
注意事项
- 请确保
$file变量为本地文件的绝对路径,且PHP进程对该文件有读取权限 - 若接口要求的文件字段名为
ModelRelease而非PropertyRelease,只需要修改第二个表单字段的name值对应即可
内容的提问来源于stack exchange,提问作者Xch0
相关产品推荐
相关产品推荐

