2013-06-24 46 views
11

Tôi đang cố gắng tạo nút sẽ buộc tải xuống tệp CSV nhưng vì một lý do nào đó tôi không thể làm cho tệp đó hoạt động. Đây là mã mà tôi có:Tải xuống Tệp 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'); 

} 

Các $ result biến xuất phát từ đây:

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; 
} 

Im không chắc chắn thậm chí để bắt đầu tìm kiếm ở đâu. Tôi đã xem qua internet trên nhiều cách khác nhau để làm điều này và đã thử tất cả chúng và vẫn không thể quản lý để làm cho nó hoạt động. Hãy giúp tôi ra!

-Cảm ơn

+1

Vậy điều gì sẽ xảy ra? Thông báo lỗi? Tệp có hiển thị trong trình duyệt không? Tải xuống tệp có bị hỏng không? – JJJ

+0

Tệp không tải xuống và khi tôi sử dụng Firefox chẳng hạn và sử dụng Firebug để xem nút nào tôi nhận được lỗi này: 500 Lỗi Máy chủ Nội bộ – MONZTAAA

Trả lời

21

Đặt mã này dưới đây vòng lặp của bạn.

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

echo $shtml; 

Làm cách nào bạn tìm ra ứng dụng loại nội dung/lực tải xuống? Tôi chưa bao giờ nghe nói về nó. Loại MIME thích hợp cho CSV là text/csv

Bạn có thể tìm thêm ví dụ về làm thế nào để sử dụng chức năng tiêu đề trong php manual

Bạn cũng cần hiển thị $shtml bạn không làm điều đó trong mã của bạn.

+0

Ý bạn là đặt tiêu đề ngay sau hoặc sau $ shtml = $ shtml. $ result [$ i] ..? -Cảm ơn – MONZTAAA

+2

Tiêu đề phải được gửi trước khi bất kỳ dữ liệu nào khác được gửi tới trình duyệt. Ngay cả nhân vật màu trắng cũng có thể phá vỡ kịch bản. – Robert

2

bạn cần phải echo nội dung của bạn sau khi tiêu đề

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

Vâng. bạn có thể thử điều này, nó sẽ hoạt động nếu kết quả của bạn không trống rỗng

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);' sẽ gây ra lỗi mà các tiêu đề đã được gửi. –

Các vấn đề liên quan