2

我想要实现的目标:强制下载包含用户选择的 pdf 文件的 zip 文件。

我在控制器中做了什么来实现这一点:

  1. 在文件夹 APP.WEBROOT_DIR.DS."package_files"(我使用 MPDF 库)中生成 pdf 报告 *它生成正确的可读 pdf。我在这里调用 $this->render();

  2. 使用 php 的 Zip 功能,生成 package.zip(由上述指定文件夹中的 pdf 文件组成) *它会生成正确的 zip 文件,当从服务器下载时,它会在 Windows 中作为有效的 zip 文件打开。

  3. 将控制器 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();

4

1 回答 1

0

首先,如果您使用 Cakephp 2.3,请使用具有以下结构的 mediaView 的蛋糕响应文件:

$this->response->file($file['path']);
// Return response object to prevent controller from trying to render
// a view
return $this->response;

这是文档:http ://book.cakephp.org/2.0/en/controllers/request-response.html#cake-response-file

否则删除 $this->render(); 在您的操作结束时并专门为 zip 和 rar 文件指定 mime 类型选项,例如为 docx 文件添加 mime 类型选项,如:

// Render app/webroot/files/example.docx
    $params = array(
        'id'        => 'example.docx',
        'name'      => 'example',
        'extension' => 'docx',
        'mimeType'  => array(
            'docx' => 'application/vnd.openxmlformats-officedocument' .
                '.wordprocessingml.document'
        ),
        'path'      => 'files' . DS
    );
于 2014-08-31T19:34:45.227 回答