强制下载CSV文件

15

我试图创建一个按钮,以强制下载CSV文件,但由于某些原因,我无法使其正常工作。这是我的代码:

public function export_to_csv($result) {

$shtml="";

for ($i=0; $i<count($result); $i++){

$shtml = $shtml.$result[$i]["order_number"]. "," .$result[$i]["first_name"]. "," .$result[$i]["middle_name"]. "," .$result[$i]["last_name"]. "," .$result[$i]["email"]. "," .$result[$i]["shipment_name"]. "," .$result[$i]["payment_name"]. "," .$result[$i]["created_on"]. "," .$result[$i]["modified_on"]. "," .$result[$i]["order_status"]. "," .$result[$i]["order_total"]. "," .$result[$i]["virtuemart_order_id"]. "\n";

}

Header('Content-Description: File Transfer');
Header('Content-Type: application/force-download');
Header('Content-Disposition: attachment; filename=pedidos.csv');

}

$result变量来源于此处:

public function get_orders_k() {

$db=JFactory::getDBO();

    $query = " select o.order_number, o.virtuemart_order_id, o.order_total, o.order_status, o.created_on, o.modified_on, u.first_name,u.middle_name,u.last_name "
    .',u.email, pm.payment_name, vsxlang.shipment_name ' .
    $from = $this->getOrdersListQuery();

$db->setQuery($query);

$result=$db->loadAssocList();

    if ( $result > 0 )
    {
        $datos = VirtueMartModelKiala::export_to_csv($result);

    }else return 0;
}

我甚至不确定从哪里开始寻找。我在互联网上查看了各种方法,并尝试了所有这些方法,但仍然无法使其正常工作。请帮助我!

- 谢谢


1
那么会发生什么呢?会出现错误信息吗?文件会在浏览器中显示吗?文件会下载但是损坏了吗? - JJJ
文件无法下载,例如我使用Firefox并使用Firebug查看按钮操作时,出现了500内部服务器错误。 - Victor York
3个回答

43

请将此代码放在您的循环下方。

header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="pedidos.csv"');

echo $shtml;

你是如何发现内容类型为application/force-download的?我从未听说过。CSV的适当MIME类型是text/csv

你可以在PHP手册中找到更多关于如何使用header函数的示例。

你还需要显示$shtml,因为你在代码中没有这样做。


你的意思是把头文件放在for循环后面还是放在$shtml = $shtml.$result[$i]之后?-谢谢 - Victor York
3
在向浏览器发送任何数据之前,应该先发送头部。即使是空格也可能会破坏脚本。 - Robert

5

嗯,您可以尝试这个方法,如果您的结果不为空,则会起作用。

public function export_to_csv($result)
{
    if(!$result) return false;
    ob_end_clean();
    header( 'Content-Type: text/csv' );
    header( 'Content-Disposition: attachment;filename=pedidos.csv');
    $fp = fopen('php://output', 'w');
    $headrow = $result[0];
    fputcsv($fp, array_keys($headrow));
    foreach ($result as $data) {
        fputcsv($fp, $data);
    }
    fclose($fp);
    $contLength = ob_get_length();
    header( 'Content-Length: '.$contLength);
}

header('Content-Length: '.$contLength); 会引发一个错误,提示头部已经发送。 - sunny kashyap

3
你需要在头部之后使用echo输出你的内容。
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename=pedidos.csv');
echo $shtml

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