创建CSV并强制下载文件

3

我有一段PHP代码,从数据库中选择数据并创建CSV文件。

它的运行很好,但是我该如何在CSV文件被创建完成后强制下载它?

我已经在页面顶部添加了头文件,但它并没有下载文件。

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=calls.csv');

$filename = $SettingsCustomer["company"].'-CallsTariff'.'-'.date("YmdHis");

// create a file pointer connected to the output stream
$output = fopen($_SERVER["DOCUMENT_ROOT"].'/file_dump/price_tariffs/'.$filename.'.csv', 'w');

// output the column headings
fputcsv($output, array('Number', 'Description', 'Per Minute Cost'));

// loop over the rows, outputting them
$cost=0;
$sql="SELECT * from call_costs where sequence < '50' ";
$rs=mysql_query($sql,$conn);
while($result = mysql_fetch_array($rs)) {
    //check for custom costs
    $sql2="SELECT * from call_costs_custom where parent = '".$result["sequence"]."' AND customer_seq = '".$SettingsCustomer["sequence"]."' ";
    $rs2=mysql_query($sql2,$conn);
    if(mysql_num_rows($rs2) > 0) {
        $result2=mysql_fetch_array($rs);

        $cost = $result2["cost"];
    } else {
        $cost = $result["retail"];
    }

    fputcsv($output, array($result["number"], $result["description"], $cost));
}

用户可以选择不下载。 - SuperBear
我希望创建的文件能够自动下载。用户点击下载链接后,它会自动创建并下载文件,这样用户就已经选择了下载! - charlie
哦,你可以在用户进入你的页面时创建文件。然后下载它。 - SuperBear
3个回答

4

Charlie,这是一种创建并强制下载csv文件的示例方法。请尝试在您的代码中实现:

<?php

$filename = 'test';

$filepath = $_SERVER["DOCUMENT_ROOT"] . $filename.'.csv';
$output = fopen($filepath, 'w+');

fputcsv($output, array("Number", "Description", "test"));
fputcsv($output, array("100", "testDescription", "10"));

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '.csv"');
header('Content-Length: ' . filesize($filepath)); 
echo readfile($filepath);

@Charlie,我改变了我的答案。 - William Pereira
抱歉 @charlie,我又改变了我的答案。 - William Pereira
1
刚刚尝试了一下,现在它只是回显整个文件。 - charlie
@Charlie,我又改变了我的答案。 - William Pereira
仍然只是回显文件。 - charlie
1
添加readfile()函数是适合我的解决方案。 - Blake Frederick

0
请下次搜索得更好一些。这总是相同的答案。
header('Content-Type: application/octet-stream');

text/csv 是一种可显示的内容类型


啊,那就是回声... 你想同时将它写入文件吗? - A. Blub
它正在很好地写入文件,我希望在创建文件完成后立即下载该文件。 - charlie
请尝试使用 echo file_get_contents( filename ); 替换您目前的 echo。 - A. Blub
别忘了在结束前关闭你的文件。 - A. Blub
我已经添加了fclose($output);但它仍然无法下载文件。即使添加了file_get_contents。 - charlie
显示剩余2条评论

0

你需要在你的端口做这个...

$file = '/file_dump/price_tariffs/'.$filename.'.csv';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;

你可以移除 get_content_file


你是否已经删除了第一个 Content-Type 头部的 text/csv? - A. Blub
好的回答,@charlie请确保在此部分之前没有输出任何内容。 - Alexis Peters
我已经将它放在一个单独的PHP页面上,没有其他代码,但它仍然只是显示它。 - charlie
有趣的问题。你可以尝试另一个浏览器吗? - A. Blub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接