2013-06-24 77 views
11

我正在嘗試創建一個按鈕,該按鈕將強制執行CSV文件下載,但由於某種原因,我無法使其工作。這是我的代碼:強制下載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; 
} 

林不知道,甚至從哪裏開始尋找。我已經通過各種方式瀏覽了互聯網,並嘗試了所有這些方法,但仍然無法實現其工作。請幫助我!

-Thanks

+1

那麼會發生什麼呢?錯誤訊息?該文件是否在瀏覽器中顯示?文件是否下載但被破壞? – JJJ

+0

該文件沒有下載,當我使用Firefox例如並使用Firebug來查看按鈕的功能時,出現以下錯誤:500內部服務器錯誤 – MONZTAAA

回答

21

將這個代碼的循環下方後echo內容。

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

echo $shtml; 

你是如何找出內容類型application/force-download的?我從來沒聽說過。正確的MIME類型CSV是文本/ CSV

你可以找到更多的例子來說明如何使用頭功能php manual

您還需要顯示$shtml你沒有做到這一點在你的代碼。

+0

您的意思是將標題放在$ shtml = $ shtml之後或之後。 $ result [$ i] ..? - 感謝 – MONZTAAA

+2

在將任何其他數據發送到瀏覽器之前應該發送標題。即使白色字符也可以打破劇本。 – Robert

2

您需要的頭

header('Content-Description: File Transfer'); 
header('Content-Type: application/force-download'); 
header('Content-Disposition: attachment; filename=pedidos.csv'); 
echo $shtml 
4

好吧。你可以試試這個,如果你的結果不是空的,它會起作用

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); 
} 
+0

'header('Content-Length:'。$ contLength);'會引發一個頭文件已經發送的錯誤。 –