如何在PHP中通过Curl正确调用Pangea API上传文件
PHP中用Curl实现Pangea文件扫描接口的正确姿势
你需要把Pangea官方提供的Curl上传请求转换成PHP代码,核心是正确处理两个-F参数:一个是指定扫描服务商的JSON参数,另一个是要上传的文件。先看官方的Curl示例:
curl -sSLX POST 'https://file-scan.aws.us.pangea.cloud/v1/scan' \ -H 'Authorization: Bearer <your_token>' \ -H 'Content-Type: multipart/form-data' \ -F 'request={"provider":"crowdstrike"};type=application/json' \ -F 'upload=@test.png;type=application/octet-stream'
你的当前代码存在几个关键问题:
CURLOPT_POSTFIELDS只传了空字符串'{}',没有正确构造multipart表单数据- 手动设置了
Content-Type: multipart/form-data,这会导致Curl自动生成的表单边界符失效,服务器无法解析数据 - 多余设置了
CURLOPT_CUSTOMREQUEST为POST,CURLOPT_POST = TRUE已经足够
下面是修正后的完整代码,完全对应官方的Curl参数:
<?php $myfile = 'data_file.png'; $accesstoken = 'your actual access token'; $url = 'https://file-scan.aws.us.pangea.cloud/v1/scan'; // 构造request参数的JSON内容 $requestJson = json_encode([ 'provider' => 'crowdstrike' ]); // 准备multipart表单数据 $postFields = [ // 指定request参数的Content-Type为application/json 'request' => [ 'name' => 'request', 'contents' => $requestJson, 'type' => 'application/json' ], // 上传文件,推荐用CURLFile(PHP 5.5+),比@更安全 'upload' => new CURLFile( realpath($myfile), 'application/octet-stream', basename($myfile) ) ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, TRUE); // 不要手动设置Content-Type: multipart/form-data,Curl会自动添加带边界符的正确头 curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer $accesstoken" ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $output = curl_exec($ch); echo $output; $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 捕获错误 if (curl_errno($ch)) { echo 'Curl错误: ' . curl_error($ch); } curl_close($ch); ?>
关键细节说明:
- request参数处理:用数组形式指定
contents和type,对应Curl中-F 'request={...};type=application/json'的逻辑,告诉服务器这个字段是JSON格式 - 文件上传:使用
CURLFile类替代传统的@语法,避免安全风险(比如open_basedir限制),同时指定文件的MIME类型为application/octet-stream - Content-Type头:必须删除手动设置的
Content-Type: multipart/form-data,因为Curl会自动生成包含边界符的完整Content-Type头(比如multipart/form-data; boundary=------------------------XXXXXX),没有边界符服务器无法解析表单数据 - 冗余选项清理:删除
CURLOPT_CUSTOMREQUEST,因为CURLOPT_POST = TRUE已经明确是POST请求,重复设置可能引发冲突
这样调整后,你的PHP代码就和官方的Curl请求完全一致了,能正确向Pangea服务器上传文件并指定扫描服务商。
内容的提问来源于stack exchange,提问作者Nancy Moore
相关产品推荐
相关产品推荐

