我已经查看了其他答案,但我相信我的问题可能会有所不同。我不是一个cURL高手,我希望有人可以告诉我应该在哪里指导我的工作。
本地PHP脚本传输包含文本值和文件的$ _POST数组。数据由服务器上的PHP脚本接收。等式中没有浏览器。我从网上拿起代码。
完全适用于本地开发HTTP服务器(Cherokee)。 在远程实时HTTP服务器(Apache)上失败。
发送代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
post_array=array("my_file"=>"@".$File,"upload"=>"Upload","var1"=>P1,"var2"=>P2,"var3"=>P3);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_array);
if(!curl_errno($ch))
{
$info = curl_getinfo($ch);
echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}
发送脚本将$ _POST内容显示为:
Array
(
[my_file] => @<path to file>
[upload] => Upload
[var1] => P1
[var2] => P2
[var3] => P3
)
在远程服务器上,脚本将$ _POST数组接收为:
Array
(
[upload] => Upload
)
我正在使用CURLOPT_VERBOSE,我得到以下屏幕输出:
* About to connect() to <domain name> port 80 (#0)
* Trying 82.71.205.4... * connected
> POST <receiving file> HTTP/1.1
User-Agent: Mozilla/4.0 (compatible;)
Host: <domain name>
Accept: */*
Content-Length: 22091
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------734a2c311f30
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Thu, 21 Nov 2013 14:09:13 GMT
< Server: Apache
< X-Powered-By: PHP/5.3.17
< Content-Length: 199
< Content-Type: text/html
<
* Connection #0 to host <domain name> left intact
Took 0.718261 seconds to send a request to <receiving file>
所以,我知道以下内容:
1/ Script works perfectly on dev server, but on live server...
2/ curl_errno says no errors.
3/ CURLOPT_VERBOSE reports expected array size (22091).
4/ Receiving file receives data, but not $_POST array content.
5/ No entries in server error log.
有人能告诉我应该在哪里调查吗?
答案 0 :(得分:1)
这两行需要颠倒过来:
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
post_array=array("my_file"=>"@".$File,"upload"=>"Upload","var1"=>P1,"var2"=>P2,"var3"=>P3);
另外,post_array = ...
无效。你要分配一个常量。
应该是:
$post = array( blah blah blah );
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
答案 1 :(得分:0)
由于application/x-www-form-urlencoded
(默认情况下),请尝试http_build_query():
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_array));
答案 2 :(得分:0)
这不是一个正确的答案,但我发现如果我只上传文件并且不在$ _POST数组中包含任何其他值,那么它适用于Apache。
我无法找到为什么它适用于Cherokee而不是Apache,但至少我有一个解决方法。转移到使用切诺基的网络主机会比它的价值更麻烦。
我会认为这是一种解决方法。也许它可能在将来帮助某人。
答案 3 :(得分:0)
我认为这个问题与POST数据字段开头的“at”符号(@)有关。我的脚本中有同样的问题。我相信urlencoding数据应该解决问题。
post_array=array("my_file"=>urlencode("@".$File),"upload"=>"Upload","var1"=>P1,"var2"=>P2,"var3"=>P3);