Intereting Posts
Поврежденный файл из файла заголовка PHP, возвращаемого из базы данных? как перейти на ту же страницу после входа в PHP Есть ли хорошие библиотеки php, которые могут конвертировать html / php документы в объекты Замена значения параметра querystring с помощью mod_rewrite PBKDBF2 hash – дублирующая функциональность класса .NET rfc2898DerivedBytes в PHP как получить результаты в реальном времени с помощью jquery? Сессия не сохраняется при переходе с ssl на non-ssl Возвращает переменную в моей модели, если запрос возвращает true Я не могу вводить информацию из формы в базу данных Загрузите изображение с помощью JavaScript с другого сервера через AJAX Запрошенный URL / имя_проекта / пользователи не были найдены на этом сервере. Laravel Как получить текст привязки с помощью DomDocument? Внедрение JCrop в загрузке ajax Ошибка типа содержимого при использовании Zend_Http_Client функции фейстона и бобовых стеблей

PHPExcel_Writer_Exception с сообщением «Не удалось закрыть zip-файл php: // output».

Я использую 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 где $objZip – это экземпляр класса ZipArchive .

В чем причина проблемы и как ее решить? Спасибо.

Наиболее распространенной причиной этой ошибки при сохранении на выходе php: // является ограничение open_basedir, которое не включает в себя временную папку действительной системы (например, /tmp ) или разрешения для временной папки системы … suhosin также может влиять на эту , даже если очевидные разрешения отображаются правильно.

Возможный рабочий стол – записать файл в файловую систему в каталоге, который, как вы знаете, имеет полные права на запись, а затем использовать readfile () для потоковой передачи этого файла на php: // перед удалением файла

Спасибо Марку Бейкеру. Его ответ решил проблему. Я написал простой вспомогательный метод, используя его подход.

 static function SaveViaTempFile($objWriter){ $filePath = sys_get_temp_dir() . "/" . rand(0, getrandmax()) . rand(0, getrandmax()) . ".tmp"; $objWriter->save($filePath); readfile($filePath); unlink($filePath); } 

И я только что заменил $objWriter->save('php://output') с помощью SaveViaTempFile($objWriter)

Привет, я пробовал следующее: на сервере linux Centos 7.0 не указывается маршрут каталога tmp, input:

 function SaveViaTempFile($objWriter){ $filePath = '' . rand(0, getrandmax()) . rand(0, getrandmax()) . ".tmp"; $objWriter->save($filePath); readfile($filePath); unlink($filePath); exit; } 

и работа !!

У меня была такая же ошибка, когда я пытаюсь запустить свой php-файл, просто измените следующую строку:

 $objWriter->save("/dir1"."/".$file.".xlsx"); 

для этого:

 $objWriter->save(dirname(__FILE__)."/dir1"."/".$file.".xlsx"); 

добавьте путь dir и он сработал !!!.

И мой ответ: у Filename были такие символы, как «:», «,», «» «Пришлось заменить их на разные.

Для некоторых людей, у которых может быть такое же сообщение ERROR: это может быть просто потому, что имя файла, которое вы пытаетесь сохранить, на самом деле уже открыто в вашем Excel .. Был ли мой случай

set chmod 777 -R public / results

Для формата Excel2007 работает следующее. Его нужно будет адаптировать для разных форматов.


Открыть этот файл:

 \Classes\PHPExcel\Writer\Excel2007.php 

Посмотрите около линии 196 для:

 if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp'); 

Замените вторую строку следующим образом:

  $pFilename = dirname(\__FILE__).'/'. rand(0, getrandmax()) . rand(0, getrandmax()) . ".phpxltmp"; 

Затем вы можете использовать функцию export, как описано в руководстве разработчика.