2013-11-28 18 views
10

私はいくつかのファイルをアップロードするアプリケーションを1つ持っており、zipファイルとして圧縮してダウンロードできます。Symfony2 zipファイルを作成してダウンロードします

輸出アクション:

public function exportAction() { 
     $files = array(); 
     $em = $this->getDoctrine()->getManager(); 
     $doc = $em->getRepository('AdminDocumentBundle:Document')->findAll(); 
     foreach ($_POST as $p) { 
      foreach ($doc as $d) { 
       if ($d->getId() == $p) { 
        array_push($files, "../web/".$d->getWebPath()); 
       } 
      } 
     } 
     $zip = new \ZipArchive(); 
     $zipName = 'Documents-'.time().".zip"; 
     $zip->open($zipName, \ZipArchive::CREATE); 
     foreach ($files as $f) { 
      $zip->addFromString(basename($f), file_get_contents($f)); 
     } 

     $response = new Response(); 
    $response->setContent(readfile("../web/".$zipName)); 
    $response->headers->set('Content-Type', 'application/zip'); 
    $response->header('Content-disposition: attachment; filename=../web/"'.$zipName.'"'); 
    $response->header('Content-Length: ' . filesize("../web/" . $zipName)); 
    $response->readfile("../web/" . $zipName); 
    return $response; 
    } 

すべてが行ヘッダまでokです。 と私はここに行くつもりです: "警告:readfile(../ web/Documents-1385648213.zip):ストリームを開けませんでした:そのようなファイルやディレクトリはありません"

何が問題なのですか?

ファイルをアップロードすると、このファイルにはroot権限があり、作成したzipファイルでも同じことが起こります。

答えて

7

解決:

$zip->close(); 
header('Content-Type', 'application/zip'); 
header('Content-disposition: attachment; filename="' . $zipName . '"'); 
header('Content-Length: ' . filesize($zipName)); 
readfile($zipName); 

は明らかにファイルを閉じることが重要です。)

+0

コントローラが応答を返す必要があります。最後の行は '' 'return new(readfile($ zipName));' 'のようになります。 – jdewit

+0

readfile()は応答に入れることができる文字列を返しません。そのためにストリーミングレスポンスを使用するか、file_get_contentsを使用する必要があります –

0

私は '=あなたがジッパーのあなたのIDのポスト変数で

$zipFilesIds = $request->request->get('zipFiles') 
foreach($zipFilesIds as $zipFilesId){ 
    //your vérification here 
} 

を使用することをそのより良いと思いますzipファイル '。すべての$ _POST変数を取得する方が優れています。

6

symfonyの3例に有用であろう:

public function zipDownloadAllDocumentAction($documents) 
{ 
    $files = array(); 
    $em = $this->getDoctrine()->getManager(); 

    foreach ($documents as $d) { 
     array_push($files, "../web/".$d->getWebPath()); 
    } 

    $zip = new \ZipArchive(); 
    $zipName = 'Documents_'.time().".zip"; 
    $zip->open($zipName, \ZipArchive::CREATE); 
    foreach ($files as $f) { 
     $zip->addFromString(basename($f), file_get_contents($f)); 
    } 
    $zip->close(); 

    $response = new Response(file_get_contents($zipName)); 
    $response->headers->set('Content-Type', 'application/zip'); 
    $response->headers->set('Content-Disposition', 'attachment;filename="' . $zipName . '"'); 
    $response->headers->set('Content-length', filesize($zipName)); 

    return $response; 
} 
関連する問題