Symfony2 create and download zip file

后端 未结 7 808
Happy的楠姐
Happy的楠姐 2020-12-15 06:51

I have one application that upload some files and then I can compress as zip file and download.

The export action:

public function exportAction() {
          


        
相关标签:
7条回答
  • 2020-12-15 07:01

    Since Symfony 3.2+ can use file helper to let file download in browser:

    public function someAction()
    {
        // create zip file
        $zip = ...;
    
        $this->file($zip);    
    }
    
    0 讨论(0)
  • 2020-12-15 07:05

    Work for me. Where $archive_file_name = 'your_path_to_file_from_root/filename.zip'.

    $zip = new \ZipArchive();
    
    if ($zip->open($archive_file_name, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE) === TRUE) {
      foreach ($files_data as $file_data) {
    
        $fileUri = \Drupal::service('file_system')->realpath($file_data['file_url']);
        $filename = $file_data['folder'] . $file_data['filename'];
        $zip->addFile($fileUri, $filename);
      }
      $zip->close();
    }
    
    
    $response = new Response();
    
    $response->headers->set('Cache-Control', 'private');
    $response->headers->set('Content-type', 'application/zip');
    $response->headers->set('Content-Disposition', 'attachment; filename="' . basename($archive_file_name) . '"');
    $response->headers->set('Content-length', filesize($archive_file_name));
    
    // Send headers before outputting anything.
    $response->sendHeaders();
    $response->setContent(readfile($archive_file_name));
    return $response;
    
    0 讨论(0)
  • 2020-12-15 07:06

    SYMFONY 3 - 4 example :

    use Symfony\Component\HttpFoundation\Response;
    
    /**
    * Create and download some zip documents.
    *
    * @param array $documents
    * @return Symfony\Component\HttpFoundation\Response
    */
    public function zipDownloadDocumentsAction(array $documents)
    {
        $files = [];
        $em = $this->getDoctrine()->getManager();
    
        foreach ($documents as $document) {
            array_push($files, '../web/' . $document->getWebPath());
        }
    
        // Create new Zip Archive.
        $zip = new \ZipArchive();
    
        // The name of the Zip documents.
        $zipName = 'Documents.zip';
    
        $zip->open($zipName,  \ZipArchive::CREATE);
        foreach ($files as $file) {
            $zip->addFromString(basename($file),  file_get_contents($file));
        }
        $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));
    
        @unlink($zipName);
    
        return $response;
    }
    
    0 讨论(0)
  • 2020-12-15 07:10

    I think its better that you use

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

    with the post variable of your id of zip = 'zipFiles'. Its better of fetching all $_POST variables.

    0 讨论(0)
  • 2020-12-15 07:10

    To complete vincent response, just add this right before returning response :

    ...
    $response->headers->set('Content-length', filesize($zipName));
    
    unlink($zipName);
    
    return $response;
    
    0 讨论(0)
  • 2020-12-15 07:12

    solved:

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

    apparently closing the file is important ;)

    0 讨论(0)
提交回复
热议问题