下载文件的PHP头导致字符串更改?

下载文件的PHP头导致字符串更改?,php,curl,Php,Curl,我在尝试通过PHP将字符串下载到文件时遇到问题 $start = explode('-', Requests::param('start')); $end = explode('-', Requests::param('end')); $dates = array( 'start' => array( 'year' => intval($start[0]), 'm

我在尝试通过PHP将字符串下载到文件时遇到问题

$start = explode('-', Requests::param('start'));
        $end = explode('-', Requests::param('end'));

        $dates = array(
            'start' => array(
                'year' => intval($start[0]),
                'month' => intval($start[1]),
                'day' => intval($start[2])
            ),
            'end' => array(
                'year' => intval($end[0]),
                'month' => intval($end[1]),
                'day' => intval($end[2])
            )
        );

        $dates_json = json_encode($dates);

        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_POST, count($dates_json));
        curl_setopt($ch,CURLOPT_POSTFIELDS, $dates_json);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json'
        ));
        $result = curl_exec($ch);
        curl_close($ch);

        header('Content-Disposition: attachment; filename="activities.csv"');
        header('Content-Type: text/csv');
        header('Content-Length: ' . strlen($result));
        header('Connection: close');

        echo $result;
$result
是一个CSV文件字符串

它是通过CURL请求来实现的,如果我没有标题并记录它,它就应该是这样的

但是,只要我添加
标题
函数,我的
$result
字符串就会从CSV文件变为一个
,我不知道为什么

如果我把它记录到我的错误文件中,它只是作为
1
而不是
记录,这也很奇怪

唯一设置的另一个标题是
X-Powered-By:PHP/5.5.20
,因此这里不应该有任何问题


我能做些什么来解决这个问题?

您的代码有几个问题:

  • CURLOPT_POST
    是一个布尔选项。您应该将其设置为
    TRUE
    1
    。将其设置为计数没有意义

    但是,结果是一个
    字符串
    (或
    )。应用于非
    数组
    或结果为
    1
    的对象,因此它实际上是以一种迂回的方式工作的

  • CURLOPT_POSTFIELDS
    该选项需要URL编码的字符串或关联数组。你应该通过类似以下的考试:

    curl_setopt($ch,CURLOPT_POSTFIELDS, 'dates=' . rawurlencode ($dates_json));
    
    或:

    或(例如):

    或其他一些键和值的组合,具体取决于目标脚本。在上面的示例中,脚本必须使用
    $\u POST['dates']
    检索值,或者在最后一个示例中,
    $\u POST['start']
    $\u POST['end']

  • CURLOPT_HTTPHEADER
    这对于正常的
    POST
    请求没有任何意义。我认为Curl将根据提供给的值的形式,将
    内容类型设置为
    应用程序/x-www-form-urlencoded
    多部分/表单数据

  • curl\u exec()
    的默认行为是直接输出结果,并返回
    TRUE
    FALSE
    。如果
    curl\u exec()将输出
    1

    如果希望
    curl\u exec()
    返回结果而不是
    TRUE
    ,则需要调用
    curl\u setopt(CURLOPT\u RETURNTRANSFER,1)

总结 总而言之,根据目标
$url
所需的参数,您的代码可能如下所示:

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, 'dates=' . rawurlencode ($dates_json));

if (!curl_exec($ch)) {
  // Error message
}
curl_close($ch);
curl_setopt($ch,CURLOPT_POSTFIELDS, 'dates=' . rawurlencode ($dates_json));
curl_setopt($ch,CURLOPT_POSTFIELDS, array ('dates' => $dates_json));
curl_setopt($ch,CURLOPT_POSTFIELDS, 
  array ('start' => Requests::param('start'),
         'end'   => Requests::param('end')));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Content-Type: application/json'
));
$result = curl_exec($ch);
...
echo $result;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, 'dates=' . rawurlencode ($dates_json));

if (!curl_exec($ch)) {
  // Error message
}
curl_close($ch);