我使用php curl已经有一段时间了,最近我偶然发现了一条Curl,我无法在PHP中工作。
CLI卷曲看起来如下:
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代码来模拟上面的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服务器上运行原始curl命令时,尝试通过PHP时才会出现此错误--它工作得很好。
关于double -F选项,我是否犯了错误?或者,我是否忽略了新的CURLFile发布方法中的一些内容,因为在之前所有关于Stack的文章中,使用了使用“@”的弃用方法?
在调试时,curl cli命令和php curl的头部分似乎是相同的。由于ssl加密(https,不能在接收服务器上关闭),无法很容易地验证负载本身。
提前谢谢你。
G.
发布于 2015-12-10 11:20:23
这个问题是固定的。CURL工作得很好,这是供应商API集成,这并不是预期的那样。
它要求一个JSON选项变量,但是没有记录的是顺序是重要的,如果您请求一个JSON,这是完全不能接受的。
供应商将被告知并修补此问题,因为在进行详细调查时,解析JSON的方法可能会带来一些安全后果。
https://stackoverflow.com/questions/33999070
复制相似问题