我需要使用cUrl将文件发送到表单。 网站即时发送,提供了一个cUrl命令来上传文件,该命令可以从命令行运行,但是我无法使用php curl。
这是cUrl命令:
curl -x [<proxy_url>:<proxy_port>] -k -v --key key-<id>_nopw.pem --cacert ./ca_Zertifikat-<id>.pem --cert client_Zertifikat-<id>.pem -F upload=@C:\pathto\file.XML https://url.com/upload.php
这是我的PHP代码:
$ch = curl_init($url); curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
curl_setopt($ch, CURLOPT_CAINFO, $caFile);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$postdata = array();
$postdata['upload'] = realpath($filename);
curl_setopt($ch, CURLOPT_POST, sizeof($postdata));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
我从服务器获得的响应数量为:
"Error in transmission, no file has been uploaded"
我通过手动尝试表单来检查消息,这意味着文件对话框中没有选择任何文件。 我错过了什么?
修改 这是有效的,但我被告知这将无法在服务器上运行,因为可能会阻止这个:
exec('curl -k -v --key '.$keyFile.' --cacert '.$caFile.' --cert '.$certFile.' -F upload=@'.realpath($filename).' https://url.com/upload.php', $result);
答案 0 :(得分:1)
我找到了解决方案。 我不得不改变这个:
$postdata['upload'] = realpath($filename);
到这一行:
$postdata['upload'] = new CURLFile(realpath($filename), 'text/xml');
这从旧的上传方式改为新的方式。 我之前尝试过这种方法,但是我设置了错误的MIME类型,最终无效。