PHP cURL $ _POST数组未传输

时间:2013-11-21 14:50:29

标签: php post curl

我已经查看了其他答案,但我相信我的问题可能会有所不同。我不是一个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.

有人能告诉我应该在哪里调查吗?

4 个答案:

答案 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);