2012-04-24 34 views
16

Tôi đang tạo bộ điều khiển "Tải xuống" bằng Symfony 2, có mục đích duy nhất là gửi tiêu đề để tôi có thể tải xuống tệp .csv nhưng không hoạt động đúng cách.Làm cách nào để tải xuống tệp .csv trong Symfony 2, sử dụng đối tượng Response?

$response = new Response(); 
$response->headers->set('Content-Type', "text/csv"); 
$response->headers->set('Content-Disposition', 'attachment; filename="'.$fileName.'"'); 
$response->headers->set('Pragma', "no-cache"); 
$response->headers->set('Expires', "0"); 
$response->headers->set('Content-Transfer-Encoding', "binary"); 
$response->headers->set('Content-Length', filesize($fileName)); 
$response->prepare(); 
$response->sendHeaders(); 
$response->setContent(readfile($fileName)); 
$response->sendContent(); 

$fileName là một chuỗi "info.csv". Đó là những hành động của tôi bên trong bộ điều khiển của tôi, không có câu trả lời nào. Khi tôi thử trả lại đối tượng Response, nội dung của tệp được hiển thị trong trình duyệt, không phải kết quả dự định của tôi.

Vấn đề tôi đã tìm thấy là trong một số trang tôi có được info.csv file của tôi, nhưng trong anothers tất cả tôi nhận được là một thông điệp:

No webpage was found for the web address: http://mywebpage.com/download Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found.

Tôi hoàn toàn chắc chắn rằng các tập tin tồn tại , do đó, phải có một điều sai trái. Ngoài ra, routing.yml đang hoạt động chính xác, vì tôi nhận được tệp từ các trang khác cũng liên kết đến đường dẫn đó. Nhật ký lỗi Apache không hiển thị bất cứ điều gì về nó.

Có ai đã buộc tải xuống tệp .csv trên Symfony 2 trước đây không? Nếu vậy, tôi đang làm gì sai?

Trả lời

33

Dưới đây là một ví dụ rất nhỏ mà làm việc tốt trong sản xuất:

class MyController 
public function myAction() 

    $response = $this->render('ZaysoAreaBundle:Admin:Team/list.csv.php',$tplData); 

    $response->headers->set('Content-Type', 'text/csv'); 
    $response->headers->set('Content-Disposition', 'attachment; filename="teams.csv"'); 

    return $response; 

Bạn có thể thay thế các cuộc gọi render với phản ứng mới và response-> setContent nếu bạn muốn.

Nhận xét của bạn về không có câu lệnh trả về trong bộ điều khiển là khó hiểu. Bộ điều khiển trả về một phản hồi. Hãy để khung làm việc chăm sóc gửi các công cụ cho trình duyệt.

+0

$ tpldata không được xác định –

7

Tôi nhận thấy bài đăng này khá cũ và có đủ kỳ quặc, thực tế không có tài nguyên tốt về cách thực hiện Xuất CSV trong symfony 2 bên cạnh bài đăng này ở stackoverflow.

Dù sao thì tôi đã sử dụng ví dụ trên cho trang web cuộc thi của khách hàng và nó hoạt động khá tốt. Nhưng hôm nay tôi nhận được e-mail và sau khi tự mình kiểm tra, mã đã bị hỏng - tôi có thể tải xuống làm việc với một lượng nhỏ kết quả, nhưng cơ sở dữ liệu hiện xuất hơn 31.000 hàng hoặc đơn giản chỉ hiển thị văn bản hoặc chrome, về cơ bản không làm gì cả.

Đối với bất cứ ai có vấn đề với một xuất khẩu dữ liệu lớn, đây là những gì tôi manged để có được để làm việc, về cơ bản làm những gì Cerad gợi ý như một cách thay thế:

$filename = "export_".date("Y_m_d_His").".csv"; 
    $response = $this->render('AppDefaultBundle:Default:csvfile.html.twig', array('data' => $data)); 

    $response->setStatusCode(200); 
    $response->headers->set('Content-Type', 'text/csv'); 
    $response->headers->set('Content-Description', 'Submissions Export'); 
    $response->headers->set('Content-Disposition', 'attachment; filename='.$filename); 
    $response->headers->set('Content-Transfer-Encoding', 'binary'); 
    $response->headers->set('Pragma', 'no-cache'); 
    $response->headers->set('Expires', '0'); 

    $response->prepare(); 
    $response->sendHeaders(); 
    $response->sendContent(); 

EDIT: Sau khi kiểm tra ngày càng nâng tỉ số tối đa số giây được cho phép, tôi nhận ra mã trước đó đã in ra các tiêu đề ở trên cùng vì vậy tôi đã cập nhật mã.

+1

Cảm ơn vì điều này. Tôi đã phải chuyển đối tượng Request $ request thông qua phương thức $ response-> prepare() để làm cho nó hoạt động. – Acyra

5

Điều này đã giúp tôi xuất CSV và JSON.

Tệp Twig được đặt tên: export.csv.twig, export.json.cành

Controller:

class PrototypeController extends Controller { 

public function exportAction(Request $request) { 

    $data = array("data" => "test"); 

    $format = $request->getRequestFormat(); 

    if ($format == "csv") { 
     $response = $this->render('PrototypeBundle:Prototype:export.' . $format . '.twig', array('data' => $data)); 
     $filename = "export_".date("Y_m_d_His").".csv"; 
     $response->headers->set('Content-Type', 'text/csv'); 
     $response->headers->set('Content-Disposition', 'attachment; filename='.$filename); 

     return $response; 
    } else if ($format == "json") { 
     return new Response(json_encode($data)); 
    } 
} 
} 

Các Routing:

prototype_export: 
    pattern: /export/{_format} 
    defaults: { _controller: PrototypeBundle:Prototype:export, _format: json } 
    requirements: 
     _format: csv|json 

cành:

export.csv.twig (làm dấu phẩy điều tách của bạn ở đây, đây là just a test)

{% for row in data %} 
{{ row }} 
{% endfor %} 

export.json.twig (dữ liệu được gửi json_encoded, tệp này trống)

Hy vọng điều này sẽ hữu ích!

-1

Làm thế nào về việc sử dụng xuất khẩu Sonata của:

use Exporter\Writer\CsvWriter; 
/** 
* @param array $orders 
*/ 
public function exportToCsv($orders) 
{ 
    $rootdir = $this->get('kernel')->getRootDir(); 
    $filename = $rootdir . '/data/orders.csv'; 
    unlink($filename); 
    $csvExport = new CsvWriter($filename); 
    $csvExport->open(); 
    foreach ($orders as $order) 
    { 
     $csvExport->write($order); 
    } 
    $csvExport->close(); 
    return; 

} 

Nó bị treo nếu tập tin đã tồn tại, do đó bỏ liên kết-lệnh.

+0

Điều này giúp OP tải xuống CSV thông qua trình duyệt như thế nào? Trong mọi trường hợp, hãy thử kiểm tra xem tệp có tồn tại hay không trước khi cố gắng hủy liên kết nó .... –

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