Вы не четко указали все детали вашего скрипта, но вы начинаете с описания "zip-файла" и ссылки на "архивы". Однако тот небольшой код, который вы опубликовали, отправляет заголовок типа контента для файла Excel. Если вы отправляете zip-файл в браузер, но сообщаете браузеру, что его тип MIME application / vnd.ms-excel , то это может быть вашей проблемой.
Рассматривали ли вы только использование функции force_download? Этот контроллер работает для меня независимо от того, является ли файл Excel или ZIP:
public function download() {
$filepath = "/path/to/file.zip";
// or you can send an Excel file
$filepath = "/path/to/file.xls";
$filename = basename($filepath);
$data = file_get_contents($filepath);
$this->load->helper('download');
force_download($filename, $data);
}
Функция force_download имеет встроенный код для определения правильного типа MIME на основе расширения файла . В зависимости от вашей версии Codeigniter вам может потребоваться указать третий параметр TRUE .
Я повторил проблему «искаженного символа», которую вы описываете, установив mime-тип application / vnd.ms-excel , но отправив ZIP-файл. И наоборот, я успешно загрузил файлы ZIP и XLS, просто используя функцию force_download.
EDIT
Увидев некоторый код, я хотел бы предложить вам переработать логику вокруг строки 229 , так как немного неловко проверять count($result)
внутри цикла foreach. Вы можете проверить это перед входом в цикл foreach.
Что еще более важно, вам не удалось инициализировать $download_data
как массив перед назначением элементов массива. В зависимости от вашей среды и настроек error_reporting, это может вызвать E_NOTICE или E_WARNING, которые вызывают дополнительный вывод, прежде чем вы начнете выводить содержимое вашего zip-файла. Если ваш код заканчивает выводить нежелательные символы до того, как он начинает выводить фактические двоичные данные вашего zip-архива, это повредит файл. Другая возможность состоит в том, что ссылка на неопределенную переменную вызовет ошибку E_NOTICE для вывода на стандартный вывод, что может привести к сбою любых последующих команд заголовка, поскольку вы не можете отправлять команды заголовка после начала вывода текста.
Другая возможность - неверный тип пантомимы. Ваша версия Codeigniter довольно старая, но я думаю, что это вряд ли проблема. Если вы можете, попробуйте проверить заголовки ответа, отправленные в ваш браузер, чтобы узнать, являются ли они application / x-gzip или application / zip или что-то еще.
Наконец, вы должны проверить настройку compress_output в appilcation / config.php . Пожалуйста, обратите внимание на комментарии там:
/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads. When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| Only used if zlib.output_compression is turned off in your php.ini.
| Please do not use it together with httpd-level output compression.
|
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts. For
| compression to work, nothing can be sent before the output buffer is called
| by the output class. Do not 'echo' any values with compression enabled.
|
*/