То, что я пытаюсь достичь: Force загрузить zip-файл, содержащий файлы, выбранные пользователем PDF.
Что я сделал в контроллере, чтобы добиться этого:
Создавайте pdf-отчеты в папке APP.WEBROOT_DIR.DS. «Package_files» (я использовал библиотеку MPDF) * он генерирует корректный читаемый pdf-файл. Я вызываю здесь $ this-> render ();
С Zip-функцией php, Generate package.zip (который состоит из файлов PDF из указанной выше папки) * он генерирует правильный zip-файл, при загрузке с сервера он открывается как действительный zip-файл в окнах.
Установите контроллер viewClass на носитель и установите параметры для принудительной загрузки в виде zip-файла. * Снова здесь я вызываю здесь $ this-> render (); Проблема. Когда я запускаю, я получаю zip-файл, но при открытии с помощью winrar Zip-файл получает отчеты Неожиданный конец архива.
Я не получаю полезных статей, чтобы пройти эту проблему …
Я думаю, что вызов двухкратной рендеринга делает файл коррумпированным Спасибо
Мой код контроллера:
/** before this code i generate pdf files and have no issue **/
/ ** теперь просматривает каталог и добавляет все файлы PDF в zip-архив ** /
$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();
/ ** теперь отобразить действие для загрузки созданного zip-файла ** /
$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();
при fisrt, если вы используете Cakephp 2.3, используйте файл ответов на торт, созданный mediaView с такой структурой:
$this->response->file($file['path']); // Return response object to prevent controller from trying to render // a view return $this->response;
здесь doc: http://book.cakephp.org/2.0/ru/controllers/request-response.html#cake-response-file
иначе удалите $ this-> render (); в конце действия и укажите параметр типа mime специально для zip и rar-файла, например, для файла 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 );