У меня есть код PHP, который позволяет клиенту загрузить файл (в частности, надстройку Excel) с моего сервера, щелкнув ссылку в электронном письме. Однако, прежде чем начать загрузку, я хочу записать загрузку в качестве события в Google Analytics, для чего требуется POST для google-analytics.com. Вот выдержка:
<?
//log download in Google Analytics
$url = 'http://www.google-analytics.com/collect';
$fields = array(
'v' => 1,
'tid' => 'UA-12345-1',
'cid' => '555',
't' => 'event',
'ec' => 'email',
'ea' => 'foo'
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
//initiate download
$filename = '/path/to/some/file.xlam';
header('Cache-Control: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header("Content-Type: application/octet-stream");
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
readfile($f);
exit;
?>
Хотя file.xlam, похоже, правильно загружается с этим кодом, во время этого процесса он как-то поврежден. Показания, что файл поврежден, это то, что
Если я удалю код curl_close()
до curl_close()
) и просто curl_close()
часть, все будет хорошо. Я подозреваю, что это имеет какое-то отношение к "уже отправленным заголовкам", но не уверен. Есть ли обходной путь здесь?
Я обнаружил, что добавление CURLOPT_HEADER в 0 помогло.
то есть. добавьте следующую строку перед вашей линией CURLOPT_URL
curl_setopt($ch, CURLOPT_HEADER, 0); // DO NOT RETURN HTTP HEADERS
Это останавливает заголовки, возвращаемые оператором CURL.