我想要实现的目标:强制下载包含用户选择的 pdf 文件的 zip 文件。
我在控制器中做了什么来实现这一点:
在文件夹 APP.WEBROOT_DIR.DS."package_files"(我使用 MPDF 库)中生成 pdf 报告 *它生成正确的可读 pdf。我在这里调用 $this->render();
使用 php 的 Zip 功能,生成 package.zip(由上述指定文件夹中的 pdf 文件组成) *它会生成正确的 zip 文件,当从服务器下载时,它会在 Windows 中作为有效的 zip 文件打开。
将控制器 viewClass 设置为 Media 并设置参数以强制下载为 zip 文件,*这里我再次调用 $this->render(); 问题:当我运行时,我得到了 zip 文件,但是当用 winrar 打开时,得到的 Zip 文件报告了 Unexpected end of archive。
我没有得到任何有用的文章来解决这个问题......
我猜是调用两次渲染导致文件损坏 谢谢
我的控制器代码:
/** before this code i generate pdf files and have no issue **/
/** now scan through the directory and add all the pdf files to a zip archive **/
$dir = new Folder("".APP.WEBROOT_DIR.DS."package_files");
$files = $dir->find('.*\.pdf');
$zip = new ZipArchive();
foreach ($files as $file) {
$file_path = $dir->pwd() . DS . $file;
$filename = $dir->pwd() . DS ."package.zip";
if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
exit("cannot open <$filename>\n");
}
$zip->addFile($file_path,$file);
}
$zip->close();
/** now render the action to download the generated zip file **/
$this->viewClass = 'Media';
$params = array(
'id' => 'package.zip',
'name' => 'packaged_file',
'download' => true,
'extension' => 'zip',
'path' => APP . WEBROOT_DIR.DS.'package_files' . DS
);
$this->set($params);
$this->render();