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
相关产品推荐
相关产品推荐

