带有消息 "Could not close zip file php://output."的 PHPExcel_Writer_Exception

标签 php phpexcel ziparchive

我正在使用 PHPExcel 将一些数据导出到 excel 文件中给用户。我希望脚本在创建后立即将 excel 文件发送给用户。这是我的测试代码:

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();
}

在我的本地服务器上 (Windows 7 x64,Php 5.3.8,Apache 2.2.21) 我得到一个有效的 xlsx 文件。没有错误。 但是实时服务器(Linux 2.6.32-5-amd64, PHP 5.3.3-7+squeeze13, Apache 2.2.16)有问题。该脚本让浏览器下载包含以下内容的“export.xlsx”文件:

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 未在安全模式下运行。 “open_basedir”选项为空(已注释掉)。

我在 PHPExcel 文件中找到了这样的代码:

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

所以问题的原因是 $objZip->close() === false 其中 $objZipZipArchive 的一个实例> 类。

问题的原因是什么,我该如何解决?谢谢。

最佳答案

保存到 php://output 时出现此错误的最常见原因是 open_basedir 限制不包括有效系统的临时文件夹(例如 /tmp)或系统的权限temp 文件夹...suhosin 也会影响这一点,即使明显的权限似乎设置正确。

一个可能的解决方法是将文件写入文件系统中一个您知道您有完全写入权限的目录,然后在删除文件之前使用 readfile() 将该文件流式传输到 php://output

关于带有消息 "Could not close zip file php://output."的 PHPExcel_Writer_Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21436949/

相关文章:

php - mysql 数据库表中的困惑

php - 如何在一台服务器上使用 Vue.js 和 PHP?

javascript - 从整个页面中选择 div 内的前 n li 个元素

php - 为 PHPexcel 正确编码 CSV 文件

PHPExcel 遍历行和列

php - 交响乐团 3 : I can't install ckeditor

iphone - 如何检查 zip 文件是否在 IOS 中受密码保护?

javascript - 通过带有对话框的服务器上的(私有(private))网站存储/加载数据

php - 从 PHP 下载 excel 文件

php - 将 ZipArchive 与 PHP 8 和临时文件一起使用