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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:18:25