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

PHP中使用CURLOPT_PUT时如何同时传递参数与文件?

解决PHP CURLOPT_PUT上传文件时无法传递参数的问题

你的代码问题在于CURLOPT_PUT和CURLOPT_POSTFIELDS不能同时生效:当开启CURLOPT_PUT时,curl会将请求体设置为CURLOPT_INFILE指定的文件内容,此时CURLOPT_POSTFIELDS的参数会被忽略,导致参数无法传递。

下面提供两种可行的解决方案:

方案一:将参数拼接到URL查询字符串中

如果API支持通过URL传递参数,可以直接把参数附加到请求URL后面,保持PUT上传文件的逻辑不变:

$file_path_str = "你的文件路径";
$url = "API地址";
$data = array("id"=>3);

// 将参数拼接到URL
$url .= '?' . http_build_query($data);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PUT, 1);

$fh_res = fopen($file_path_str, 'r');
curl_setopt($ch, CURLOPT_INFILE, $fh_res);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file_path_str));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

fclose($fh_res);

方案二:用Multipart/form-data格式同时传递参数和文件(适配Postman示例)

如果API要求参数和文件都在请求体中传递,可以模拟Postman的form-data上传方式,使用CURLFile构造文件对象,结合PUT请求方法发送:

$file_path_str = "你的文件路径";
$url = "API地址";
$data = array("id"=>3);

// 构造包含参数和文件的请求体
$post_data = $data;
$post_data['file'] = new CURLFile($file_path_str);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// 指定请求方法为PUT
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
// 发送multipart/form-data数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

注意:确保你的PHP版本支持CURLFile(PHP 5.5+),如果是更低版本可以用@$file_path_str,但这种方式已被废弃,建议升级PHP版本。

内容的提问来源于stack exchange,提问作者Lukas Vesely

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:17:34