【问题标题】:curl CLI versus php curlcurl CLI 与 php curl
【发布时间】:2015-11-30 12:49:06
【问题描述】:

我使用 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"
  }
]

哪些是与我在代码中提供的数据相对应的所有正确数据。

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

我对双 -F 选项有误吗?还是我错过了新的 CURLFile 发布方法中的某些内容,因为在 Stack Overlow 上的所有先前帖子中都使用了不推荐使用的使用“@”的方法?

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

提前谢谢你。

G.

【问题讨论】:

    标签: php curl file-upload http-post command-line-interface


    【解决方案1】:

    此问题已修复。 CURL 完美运行,因为供应商 API 集成没有按预期运行。

    它要求一个 JSON 选项变量,但没有记录的是 ORDER 很重要,如果您请求 JSON,这是完全不可接受的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多