如何在 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文件,让用户下载