2012-04-24 66 views
16

我正在製作一個使用Symfony 2的「下載」控制器,它的唯一目的是發送標題,以便我可以強制.csv文件下載,但它不能正常工作。如何使用Response對象強制下載Symfony 2中的.csv文件?

$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"info.csv"字符串。這是我在我的控制器中的行爲,沒有返回聲明。當我嘗試返回Response對象時,文件的內容顯示在瀏覽器中,而不是我的預期結果。

我發現的問題是,在一些網頁我得到我的info.csv file,但在anothers我得到的是一個信息:

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.

我完全確保該文件存在,所以肯定會有另一件事情是錯誤的。此外,routing.yml工作正常,因爲我確實從其他頁面鏈接到該路徑的文件。 Apache錯誤日誌沒有顯示任何關於它的信息。

有沒有人在Symfony 2上強制下載.csv文件?如果是這樣,我做錯了什麼?

回答

33

這裏是工作在生產就好了一個小例子:

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; 

您可以更換新的反應和響應 - > setContent如果你喜歡渲染調用。

你對控制器內部沒有return語句的評論令人費解。控制器返回響應。讓框架負責將這些內容發送到瀏覽器。

+0

$ tpldata未定義 – 2015-07-01 20:10:37

7

我意識到這篇文章是一種古老的,有足夠奇怪的是,幾乎沒有好的資源,如何在symfony 2中做一個CSV導出,除了這個帖子在stackoverflow。

無論如何,我用上面的例子爲一個客戶競賽網站,它的工作得很好。但是今天我收到一封電子郵件,經過自己的測試後,代碼已經損壞 - 我能夠通過少量結果獲得下載,但數據庫現在可以輸出超過31,000行,只是顯示文本或與鉻,基本上什麼都沒做。

對於具有大數據導出問題的人,這是我manged去上班,基本上做什麼CERAD建議作爲另一種方法:

$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(); 

編輯:更多的測試後,並加大了最大秒,我意識到前面的代碼是打印出頂部的標題,所以我更新了代碼。

+1

感謝您的支持。我必須通過$ response-> prepare()方法來傳遞Request $ request對象才能使其工作。 – Acyra 2013-11-09 12:38:45

5

這對我來說導出CSV和JSON。

Twig文件命名爲:export.csv.twig,export.json。小枝

控制器:

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

路由:

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

細枝:

export.csv.twig(做你的逗號分隔的東西在這裏,這只是一個測試)

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

export.json.twig(數據發送json_encoded,此文件爲空)

希望這有助於!

-1

如何使用索納塔的出口商:

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; 

} 

它崩潰,如果該文件已經存在,因此取消鏈接命令。

+0

這是如何幫助OP通過瀏覽器下載CSV的?在任何情況下嘗試測試,以查看文件是否存在之前試圖解除鏈接.... – 2015-06-18 07:48:16