curl CLI 与 php curl

curl CLI versus php curl

我已经使用 php Curl 一段时间了,我最近偶然发现了一段 curl CLI,我无法在 PHP curl 中工作。

CLI curl 如下所示:

curl -qgsSkH "Content-Type: multipart/form-data"
--no-progress-bar
--header "X-Api-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-F "filename=@c/tmp/test.txt"
-F "options={\"application\":\"2\",\"timeout\":\"500\",\"priority\":\"0\"}"
https://xxxaddrxxx:443/API/vers1.0/sub

我使用以下 PHP curl 代码来模仿上面的 CLI curl:

$file = new CURLFile($fileEntry->getStoragePath());
$file->setMimeType($fileEntry->mime);
$file->setPostFilename($fileEntry->original_filename);

$data = array();
$data['options'] = json_encode($postData);
$data['filename'] = $file;

$headers = array();
$headers[] = "Content-Type: multipart/form-data";
$headers[] = 'X-FeApi-Token: '.$this->authToken;

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, TRUE);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);

$curl_response = curl_exec($curl);

当我输出 $data 数组时,它将给出以下内容:

array:2 [
  "options" => "{"application":"2","priority":"0","timeout":"5000"}"
  "filename" => CURLFile {
    +name: "/etc/tmp/5645db226dbddINVOICE-722.doc"
    +mime: "application/msword"
    +postname: "INVOICE-722.doc"
  }
]

这是我在代码中提供的所有正确数据。

尽管如此,我尝试推送文件和元数据的服务器也响应错误,即未提供或未上传选项数组或文件名。仅当我尝试通过 PHP 推送它时才会出现此错误,当我 运行 在 Linux 服务器上运行原始 curl 命令时它工作正常。

关于双 -F 选项,我是否有误?还是我错过了 posting 的新 CURLFile 方法中的某些内容,因为在 Stack Overlow 上所有以前的 post 中都使用了使用“@”的已弃用方法?

curl cli 命令的header 部分和php curl 在调试时似乎是相同的。由于 ssl 加密(https,无法在接收服务器上关闭),负载本身无法轻松验证。

提前致谢。

G.

此问题已解决。 CURL 完美运行,但供应商 API 集成未按预期运行。

它要求 JSON 选项变量,但没有记录的是 ORDER 很重要,如果您要求 JSON.

,这是完全不能接受的

供应商已获悉并将修补此问题,因为在进行详细调查时发现解析 JSON 的方法可能会产生一些安全后果。