生成并下载一个excel文件会生成一个ERR_INVALID_RESPONSE

这是我的代码:

public function downloadexcel($requestId) { $this->loadModel('MaterialsRequest'); $materialsRequests = $this->MaterialsRequest->find('all', array('conditions' => array('MaterialsRequest.request_id' => $requestId))); date_default_timezone_set('Europe/London'); if (PHP_SAPI == 'cli') die('This example should only be run from a Web Browser'); /** Include PHPExcel */ //require_once dirname(__FILE__) . '/../Classes/PHPExcel.php'; // Create new PHPExcel object $objPHPExcel = new PHPExcel(); // Set document properties $objPHPExcel->getProperties()->setCreator("mez") ->setLastModifiedBy("mez") ->setTitle("Supply Template") ->setSubject("Supply Template") ->setDescription("Supply Template , please fill and upload.") ->setKeywords("office 2007 openxml php") ->setCategory("Supply"); $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(10); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(40); $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(30); $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(30); $objPHPExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); $objPHPExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::VERTICAL_CENTER); // Add some data $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', 'Material ID') ->setCellValue('B1', 'Material Name') ->setCellValue('C1', 'Quantity') ->setCellValue('D1', 'Your offer'); $index = 2; foreach ($materialsRequests as $oneMaterialsRequests) { $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $index, $oneMaterialsRequests['MaterialsRequest']['material_id']) ->setCellValue('B' . $index, $oneMaterialsRequests['Material']['name']) ->setCellValue('C' . $index, $oneMaterialsRequests['MaterialsRequest']['qty']) ->setCellValue('E' . $index, $oneMaterialsRequests['MaterialsRequest']['id']); $index++; } /// Set sheet security $MaterialsRequestsNo = count($materialsRequests); $MaterialsRequestsNo+=1; //add count for header $objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); $objPHPExcel->getActiveSheet() ->getStyle('D2:D' . $MaterialsRequestsNo) ->getProtection()->setLocked( PHPExcel_Style_Protection::PROTECTION_UNPROTECTED ); // Miscellaneous glyphs, UTF-8 // Rename worksheet $objPHPExcel->getActiveSheet()->setTitle('Supply'); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $objPHPExcel->setActiveSheetIndex(0); // Redirect output to a client’s web browser (Excel2007) header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="Supply.xlsx"'); header('Cache-Control: max-age=0'); // If you're serving to IE 9, then the following may be needed header('Cache-Control: max-age=1'); // If you're serving to IE over SSL, then the following may be needed header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header('Last-Modified: ' . gmdate('D, d MYH:i:s') . ' GMT'); // always modified header('Cache-Control: cache, must-revalidate');// HTTP/1.1 header('Pragma: public'); // HTTP/1.0 $objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007'); $objWriter->save('php://output'); exit; } 

当我调用这个函数的时候,从我的本地服务器上调用这个函数,我可以得到excel工作表,当我调用函数时,网页会closures,但是在我的apache服务器上调用它时,会带出错误: ERR_INVALID_RESPONSE ,I通过代码放一个死(); 在每行之后,看看它将如何响应,直到在$objWriter=PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007');之后放置一个die() 它会下载电子表格,但它会被损坏,不会closures页面,它不会提出这个错误信息,但显然$objWriter->save('php://output'); 导致错误出现,页面将冻结,Excel文件不会被下载。

我debugging别人的代码,但我不能指出这一部分。

最终问题出在ZipArchive类,这就是为什么它在一台服务器上工作,而不是在另一台服务器上工作。

更多文档在这里: http : //www.php.net/manual/en/zip.installation.php

我有同样的问题。 检查“php -m”它给你一个模块列表,并检查你是否安装了“zip”模块。 http://php.net/manual/en/book.zip.php

PhpExcel需要此模块。 如果你没有它,尝试安装或更改您的PHP版本。 在我的情况下,我解决了改变我的PHP从7到PHP 5.5

您可以尝试保存到临时文件并使用redirect服务:

 $objWriter->save('wwwroot/some-file.xlsx'); header("Location: /some-file.xlsx"); exit();