Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPExcel_Writer_Exception with message "Could not close zip file php://output."

I'm using PHPExcel to export some data to user in an excel file. I would like the script to send the excel file to the user immediately after it's creation. Here is my test code:

try{    /* Some test data */   $data = array(     array(1, 10   , 2             ,),     array(3, 'qqq', 'some string' ,),   );    $objPHPExcel = new PHPExcel();   $objPHPExcel->setActiveSheetIndex(0);    /* Fill the excel sheet with the data */   $rowI = 0;   foreach($data as $row){     $colI = 0;     foreach($row as $v){       $colChar = PHPExcel_Cell::stringFromColumnIndex($colI++);       $cellId = $colChar.($rowI+1);       $objPHPExcel->getActiveSheet()->SetCellValue($cellId, $v);     }     $rowI++;   }    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');   header('Content-Disposition: attachment;filename="export.xlsx"');   header('Cache-Control: max-age=0');    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');   $objWriter->save('php://output');  }catch(Exception $e){   echo $e->__toString(); } 

On my local server (Windows 7 x64, Php 5.3.8, Apache 2.2.21) I get a valid xlsx file. There are no errors. But there is problem on the live server (Linux 2.6.32-5-amd64, PHP 5.3.3-7+squeeze13, Apache 2.2.16). The script lets the browser to download the "export.xlsx" file with such content:

exception 'PHPExcel_Writer_Exception' with message 'Could not close zip file php://output.' in /var/www/someuser/data/www/somedomain.com/libs/PHPExcel/Writer/Excel2007.php:348 Stack trace: #0 /var/www/someuser/data/www/somedomain.com/classes/Report/Leads/Export.php(339): PHPExcel_Writer_Excel2007->save('php://output') #1 /var/www/someuser/data/www/somedomain.com/application/pages/account/controllers/TestController.php(13): Report_Leads_Export->Test() #2 /var/www/someuser/data/www/somedomain.com/libs/Zend/Controller/Action.php(516): Account_TestController->indexAction() #3 /var/www/someuser/data/www/somedomain.com/libs/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction') #4 /var/www/someuser/data/www/somedomain.com/libs/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #5 /var/www/someuser/data/www/somedomain.com/index.php(511): Zend_Controller_Front->dispatch() #6 {main} 

PHP is NOT running in Safe Mode. The "open_basedir" option is empty (it's commented out).

I have found such code in the PHPExcel files:

if ($objZip->close() === false) {     throw new PHPExcel_Writer_Exception("Could not close zip file $pFilename."); } 

So the reason of the problem is that $objZip->close() === false where $objZip is an instance of ZipArchive class.

What is the reason of the problem and how can I solve it? Thank you.

like image 864
Pavel L Avatar asked Jan 29 '14 16:01

Pavel L


1 Answers

The most common cause of this error when saving to php://output is an open_basedir restriction that doesn't include a valid system's temp folder (e.g. /tmp), or permissions for the system's temp folder... suhosin can also affect this, even when the obvious permissions appear to be set correctly.

A possible workround is to write the file to the filesystem in a directory that you know you do have full privileges to write, and then use readfile() to stream that file to php://output before deleting the file

like image 72
Mark Baker Avatar answered Sep 29 '22 15:09

Mark Baker