Я пытаюсь создать короткий PHP script, который берет строку JSON, преобразует ее в формат CSV (используя fputcsv
) и делает этот CSV доступным как загруженный .csv файл. Моя мысль заключалась в том, чтобы использовать tmpfile()
, чтобы не беспокоиться о cronjobs или нехватке дискового пространства, но я не могу заставить магию произойти.
Здесь моя попытка, которая представляет собой преобразованный пример из документов PHP readfile
:
$tmp = tmpfile();
$jsonArray = json_decode( $_POST['json'] );
fputcsv($tmp, $jsonArray);
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename='.basename($tmp));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($tmp));
ob_clean();
flush();
readfile($tmp);
Мне кажется, что заголовки Content-Disposition
и Content-Transfer-Encoding
ошибочны, но я не уверен, как их исправить. Например, basename($tmp)
, похоже, ничего не возвращает, и я не уверен, что text/csv
передается как двоичная кодировка. Аналогично, echo filesize($tmp)
также пуст. Есть ли способ сделать то, что я пытаюсь здесь?
[изменить]
** Ниже приведен рабочий код, который я написал в результате принятого ответа: *
$jsonArray = json_decode( $_POST['json'], true );
$tmpName = tempnam(sys_get_temp_dir(), 'data');
$file = fopen($tmpName, 'w');
fputcsv($file, $jsonArray);
fclose($file);
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=data.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($tmpName));
ob_clean();
flush();
readfile($tmpName);
unlink($tmpName);