php - 使用cUrl将文件上传到表单

时间:2016-09-06 14:05:58

标签: php curl

我需要使用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);

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。 我不得不改变这个:

$postdata['upload'] = realpath($filename);

到这一行:

$postdata['upload'] = new CURLFile(realpath($filename), 'text/xml');

这从旧的上传方式改为新的方式。 我之前尝试过这种方法,但是我设置了错误的MIME类型,最终无效。