如何下载临时文件

php
2022-08-30 16:45:36

我正在尝试创建一个简短的PHP脚本,该脚本采用JSON字符串,将其转换为CSV格式(using),并使该CSV可用作下载的.csv文件。我的想法是用来不用担心cronjobs或磁盘空间不足,但我似乎无法让奇迹发生。fputcsvtmpfile()

这是我的尝试,这是从readfile的PHP文档中转换的示例:

$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-DispositionContent-Transfer-Encodingbasename($tmp)text/csvecho 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);

答案 1

请注意,返回一个文件句柄,但您拥有的所有函数都需要一个文件路径(即字符串),而不是句柄 - 特别是 、 和 。因此,这些函数调用都不会正常工作。也不会返回文件扩展名。随便叫什么就叫什么,即tmpfile()basenamefilesizereadfilebasename

'Content-Disposition: attachment; filename=data.csv'

正如@Joshua Burns所说,请确保将数组传递给或使用参数。fputcsvassoc


答案 2

json_decode()默认情况下,将元素转换为对象而不是数组。 期望传递的数据是一个数组。fputcsv()

我建议更改:

$jsonArray = json_decode( $_POST['json'] );

自:

$jsonArray = json_decode( $_POST['json'], True );

看看这是否不能解决您的问题。

在尝试解决此类问题时,我强烈建议启用并设置以查看是否存在某种错误:您错过了以下错误:display_errorserror_reportingE_ALL

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

// Rest of your code here

推荐