如何下载临时文件

Imp*_*tor 22 php

我正在尝试创建一个简短的PHP脚本,它接受一个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);
Run Code Online (Sandbox Code Playgroud)

我觉得Content-DispositionContent-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);
Run Code Online (Sandbox Code Playgroud)

Ivo*_*Ivo 7

请注意,tmpfile()返回一个文件句柄,但所有的功能,你需要一个文件路径(即一个字符串),而不是处理-尤其是basename,filesizereadfile.因此,这些函数调用都不会正常工作.也basename不会返回文件扩展名.只要你想要它,即

'Content-Disposition: attachment; filename=data.csv'
Run Code Online (Sandbox Code Playgroud)

正如@Joshua Burns所说,确保你传入数组fputcsv或使用assoc参数.