PHP中使用CURLfile通过CURL批量上传文件失败:仅单个文件被发送
解决PHP CURL发送多个CURLFile文件时仅单个文件生效的问题
你遇到的问题根源很明确:PHP的关联数组不允许重复的键名。你在构建CURLOPT_POSTFIELDS和测试数组时,两次使用了'attachments[]'作为键,后面的CURLFile对象直接覆盖了前面的,所以最终数组里只剩最后一个文件,自然发送时也只会传一个。
Postman能正常工作是因为它在处理表单数据时,会自动把同名的参数包装成数组结构,但PHP里手动构建数组时必须明确这种结构,不能重复用同一个键。
正确的写法有两种:
方式1:将attachments作为数组键,值为CURLFile对象的数组(推荐)
直接把多个文件放到attachments对应的数组里,curl会自动处理成attachments[]的表单格式:
<?php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://app.karzoun.chat/api/v1/accounts/1/conversations/63/messages', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'attachments' => array( new CURLFILE('gAbs95dfl/karzoun whatsapp api.jpg'), new CURLFILE('gAbs95dfl/karzoun-security.png') ), 'content' => 'test', 'message_type' => 'outgoing' ), CURLOPT_HTTPHEADER => array( 'api_access_token: uKigRL93m5MjdzC2rm4dHCjr' ), )); $response = curl_exec($curl); curl_close($curl); echo $response; ?>
方式2:使用带索引的键名
手动指定每个文件的索引,比如attachments[0]、attachments[1],这种方式和Postman生成的表单格式完全一致:
CURLOPT_POSTFIELDS => array( 'attachments[0]'=> new CURLFILE('gAbs95dfl/karzoun whatsapp api.jpg'), 'attachments[1]'=> new CURLFILE('gAbs95dfl/karzoun-security.png'), 'content' => 'test', 'message_type' => 'outgoing' ),
测试数组的正确写法
修改你的测试代码,验证数组结构:
$array = array( 'attachments' => array( new CURLFILE('/path/to/local/file1.png'), new CURLFILE('/path/to/local/file2.png') ) ); var_dump($array);
此时var_dump会输出包含两个CURLFile对象的数组,而不是被覆盖后的单个对象。
额外注意
CURLFILE需要传入服务器本地文件的路径,不能直接用远程URL(你测试代码里用了https://开头的URL,这会导致curl无法读取文件,需要先把远程文件下载到本地再使用)。
内容的提问来源于stack exchange,提问作者MKarzoun
相关产品推荐
相关产品推荐

