我在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));
有没有办法处理文件和单/多维帖子数据?
答案 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