下载文件的PHP头导致字符串更改?
我在尝试通过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
$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
该选项需要URL编码的字符串或关联数组。你应该通过类似以下的考试:CURLOPT_POSTFIELDS
或: 或(例如): 或其他一些键和值的组合,具体取决于目标脚本。在上面的示例中,脚本必须使用curl_setopt($ch,CURLOPT_POSTFIELDS, 'dates=' . rawurlencode ($dates_json));
检索值,或者在最后一个示例中,$\u POST['dates']
和$\u POST['start']
$\u POST['end']
这对于正常的CURLOPT_HTTPHEADER
请求没有任何意义。我认为Curl将根据提供给的值的形式,将POST
内容类型设置为
或应用程序/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);