如何在 CakePhp 中创建 Zip 文件并下载?

Posted

技术标签:

【中文标题】如何在 CakePhp 中创建 Zip 文件并下载?【英文标题】:How to create Zip file and download in CakePhp? 【发布时间】:2014-01-13 12:35:57 【问题描述】:

我正在尝试使用 Cakephp 1.3 创建 zip 文件。文件描述存储在数据库中。在我的控制器中,我使用以下逻辑。

   // Fetching File description form database.     
   $this->view = 'Media';
   $user_id=$this->Session->read('userData.User.id');
   $condition = "Document.isdeleted = '0' AND Document.project_id='".  $project_id."'";
   $projectDocumentList = $this->Document->find("all",array('conditions'=>$condition,'fields'=>array('Document.id','Document.document_name','Document.path'),'order' => array('Document.id ASC')));
   $this->set('projectDocumentList',$projectDocumentList);
   if(!empty($projectDocumentList))
   $fileNames = "";
   $fileNamesArr = array();
    foreach($projectDocumentList as $projectDocument)     
     $fileNamesArr[ ]= $projectDocument['Document']['document_name'];
    
   

   // Making zip
   $archive_file_name='myFile.zip';
   $file_path= "my_file_path";// Here I'm using my server basepath

   $zip = new ZipArchive();   
   if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE )!==TRUE) 
    exit("cannot open <$archive_file_name>\n");
   

   foreach($fileNamesArr as $files)
   
   $zip->addFile($file_path.$files,$files);
   //echo $file_path.$files."<br>"; // This can show the file in browser
   

   $zip->close();
   header("Content-type: application/zip");
   header("Content-Disposition: attachment; filename=$archive_file_name");
   header("Pragma: no-cache");
   header("Expires: 0");
   readfile("$archive_file_name");
   exit;

现在 zip 文件下载为 myFile.zip,但是当我要打开该文件时,它会引发错误“存档格式未知或已损坏”。

【问题讨论】:

$archive_file_name 不应只是文件名,而应是该文件的完整相对路径。 【参考方案1】:

创建整个文件夹的 Zip 文件

// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)

    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);
    


// Zip archive will be created only after closing object
$zip->close();

然后将 zip 文件的路径传递给视图。

$this->set('Zip_path'.zip_file_name);

【讨论】:

以上是关于如何在 CakePhp 中创建 Zip 文件并下载?的主要内容,如果未能解决你的问题,请参考以下文章

在 php 中创建 zip 和下载在 Mozilla 浏览器中不起作用

如何在 Java 中创建一个新的 zip 文件并向其中添加一个大目录?

Spring MVC - 在内存中创建一个ZIP文件,让用户下载

创建文本文件并添加到zip文件并下载spring boot而不保存在本地服务器中

如何在 CakePHP 中创建自定义 MySQL 查询?

Archive::Zip 无法在 Perl 中创建 Zip 对象