【发布时间】: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