Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将输出作为文件提供,而不将其保存在服务器上_Php_Csv_Export To Csv - Fatal编程技术网

Php 如何将输出作为文件提供,而不将其保存在服务器上

Php 如何将输出作为文件提供,而不将其保存在服务器上,php,csv,export-to-csv,Php,Csv,Export To Csv,我正在使用PHP的fputcsv()服务MySQL数据库中的一些记录,方法是在服务器上创建一个文件,填充它,然后在下一页链接到它 这很有效,也很好,但由于这可能是敏感数据,我不希望在服务器上挂起一堆文件,因为它们是为(可能)一次性下载而创建的 所以我想知道的是:有没有一种方法可以创建这个文件并提供下载,而不用在服务器上写一个永久文件 例如,我是否可以创建一个逗号分隔的字符串,而不是使用fputcsv(),并在输出缓冲区中使用正确的标题 显而易见的做法是删除该文件,但我需要等到客户端首先下载该文件

我正在使用PHP的
fputcsv()
服务MySQL数据库中的一些记录,方法是在服务器上创建一个文件,填充它,然后在下一页链接到它

这很有效,也很好,但由于这可能是敏感数据,我不希望在服务器上挂起一堆文件,因为它们是为(可能)一次性下载而创建的

所以我想知道的是:有没有一种方法可以创建这个文件并提供下载,而不用在服务器上写一个永久文件

例如,我是否可以创建一个逗号分隔的字符串,而不是使用
fputcsv()
,并在输出缓冲区中使用正确的标题

显而易见的做法是删除该文件,但我需要等到客户端首先下载该文件,这样就有点难以决定何时执行该操作

欢迎提出任何建议

守则:

$fp = fopen($filename, 'w');
fputcsv($fp, array("Last Name", "First Name"));
foreach ($result as $fields) 
{
    fputcsv($fp, $fields);
}
fclose($fp);

与其如此,为什么不让您的页面回显a,然后将文件回显给用户

它很有效,文件永远不会被创建并作为一次性文件传递给客户端

大概是这样的:

header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");

echo "col1,col2";
for($i=0; $i<25;$i++)
{
    echo "key :".$i.", ".($i*$i)."\r\n";
}
标题(“内容类型:应用程序/csv”);
标题(“内容处置:附件;文件名=file.csv”);
标题(“杂注:无缓存”);
标题(“到期日:0”);
回声“col1,col2”;
因为($i=0;$ifputcsv()是一个非常棒的小函数,所以我不会放弃它

相反,我建议您使用PHP的内置

例如,您可以这样做,逐行“流化”您的CSV数据(取决于各种输出缓冲区,但这是另一种情况):


我知道我把这件事搞得太复杂了。谢谢!顺便说一句,你还有第二个空括号:)别担心。修复了括号(以及其他最初的错误):)刚刚测试了这个,完成了任务。再次感谢,而且mime类型列表的链接非常方便:)
<?php
header('Content-type: text/csv; charset=UTF-8');
header('Content-disposition: attachment; filename=report.csv');
$fp = fopen('php://output','w');
foreach($arrays as $array) fputcsv($fp, $array);
<?php
$fp = fopen('php://memory','rw');

// our generateData() function might throw an exception, in which case 
// we want to fail gracefully, not send the user a broken/incomplete csv.
try {
    while($row = generateData()) fputcsv($fp, $row);
}catch(\Exception $e){
    // display a nice page to your user and exit/return
}

// SUCCESS! - so now we have CSV data in memory.  Almost like we'd spooled it to a file
//            on disk, but we didn't touch the disk.

//rewind our file handle
rewind($fp);

//send output
header('Content-type: text/csv; charset=UTF-8');
header('Content-disposition: attachment; filename=report.csv');
stream_get_contents($fp);