PHP卷曲,文件和1-d / n-d发布数据不起作用

时间:2016-02-19 14:35:18

标签: php forms apache post curl

我在php中使用curl在两台服务器之间进行通信。我们使它适用于POST和多维数组,但它不适用于文件。我们让它适用于文件,但它不适用于多维数组。这两种方式正在使用,

$post = $_POST; 

//get files and include in data
foreach($_FILES as $name=>$info)
{
    if( strlen($info['tmp_name']) )
    {
        $post[$name] = "@{$info['tmp_name']};filename={$info['name']};type={$info['type']}";
    }
}

//$post = http_build_query( $_POST ); //works for multi-dimensional arrays (not files) and not doing this works for files and 1-d data

//use curl to pass information
curl_setopt($ch, CURLOPT_POST, true);                                                            
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);  //string vs array                                    

//test on recieving end
die(print_r($_POST, true) . print_r($_FILES,true));

有没有办法处理文件和单/多维帖子数据?

2 个答案:

答案 0 :(得分:0)

你可以尝试将文件放在base64中,这样它就变成了一个字符串而不是二进制数据。

答案 1 :(得分:0)

进行了几次测试,并在PHP网站上看到了有人评论它不适用于两者(php,apache,curl)的信息。解决方案显示了一个具有硬编码结果的特定示例,以满足他们的需求,但我将概念扩展为更通用,并处理单d,多d和文件数据。

    //encode function found online for specific CURL use (on curl side)
    function _encode($arrays, &$new = array(), $prefix = null)
    {
        if ( is_object( $arrays ) )
        {
            $arrays = get_object_vars( $arrays );
        }

        foreach ( $arrays as $key => $value ) {
            $k = isset( $prefix ) ? $prefix . '[' . $key . ']' : $key;
            if ( is_array( $value ) OR is_object( $value )  ) {
                $this->_encode( $value, $new, $k );
            } else {
                $new[$k] = $value;
            }
        }
    }

//use on curl side
$post = $_POST; 

//get files and include in data
foreach($_FILES as $name=>$info)
{
    if( strlen($info['tmp_name']) )
    {
        $post[$name] = "@{$info['tmp_name']};filename={$info['name']};type={$info['type']}";
    }
}

//一般编码post以涵盖每个用例(文件,单d,multi-d,任何没有硬编码的表单设置)    $ encoded = array();    _encode($ post,$ encoded);

//使用curl传递信息    curl_setopt($ ch,CURLOPT_POST,true);
   curl_setopt($ ch,CURLOPT_POSTFIELDS,$ post); //作为数组传递

//test on recieving end
die(print_r($_POST, true) . print_r($_FILES,true)); //everything as expected