2010-06-18 112 views
0

我正在嘗試創建一個批處理操作(symfony admin),該操作可以創建/下載包含用戶照片的zip文件,這些照片可以在uploads/images目錄中使用。Symfony批處理操作

這裏是我已經實施的代碼:

public function executeBatchDownloadFotos(sfWebRequest $request) 
    { 
     $zip = new ZipArchive(); 

     // atheletes identifiers 
     $ids = $request->getParameter('ids'); 

     // get all the atheletes objects 
     $q = Doctrine_Query::create() 
      ->from('Atleta a') 
      ->whereIn('a.id', $ids); 

     foreach ($q->execute() as $atleta) 
     { 
      $zip->addFile($atleta->id . '_' . $atleta->Clube . '.jpg', 'uploads/atletas/' . $atleta->id . '_' . $atleta->Clube . '.jpg'); 
     } 
    } 

用另一隻手,這裏是視圖配置:

BatchDownloadFotos: 
    http_metas: 
    content-type: application/zip 
    has_layout:  false 

出於某種原因,每次執行批處理動作,瀏覽器不會提示我用窗口下載zip文件。

回答

2

在控制器文件中創建ZIP存檔後,應將內容發送到瀏覽器。

您可以在這裏做這說明使用方法:http://www.symfony-project.org/gentle-introduction/1_4/en/06-Inside-the-Controller-Layer#chapter_06_sub_action_termination

現在你要創建ZIP文件,但你不把它發送到瀏覽器。您應該使用setContent()和setHttpHeader()方法。

你的行動可能是這樣的(你應該添加錯誤處理):有

public function executeIndex(sfWebRequest $request) 
{ 
    $fileName = '/tmp/test.zip'; 
    $zip = new ZipArchive(); 

    $zip->open($fileName, ZipArchive::CREATE); 

    // add some files to archive 
    $zip->addFile('/tmp/test', 'test.txt'); 

    $zip->close(); 

    $this->getResponse()->setContent(file_get_contents($fileName)); 
    $this->getResponse()->setHttpHeader('Content-Type', 'application/zip'); 
    $this->getResponse()->setHttpHeader('Content-Disposition', 
    'attachment; filename=download.zip'); 

    return sfView::NONE; 
} 
+0

嗨! 我應該在setHttpHeader()方法中放置什麼? 感謝您的幫助! 此致敬禮! – 2010-06-18 18:24:08

+0

您應該設置HTTP標頭的名稱和值:http://www.symfony-project.org/api/1_4/sfWebResponse#method_sethttpheader。所以,你的情況應該是「Content-Type」和「application/zip」。您還應該設置「Content-Disposition」標頭:http://en.wikipedia.org/wiki/MIME#Content-Disposition – 2010-06-18 18:40:30

+0

嗨! 運行你的代碼,我注意到test.zip文件不是在/ tmp /目錄下創建的。 任何想法爲什麼會發生這個問題? 感謝您的幫助, 此致敬意! – 2010-06-21 17:02:26