У меня есть файл PHP, который генерирует файлы xls с помощью модуля, найденного по адресу http://pear.php.net/package/Spreadsheet_Excel_Writer/
Я могу создать образец документа очень хорошо, и когда я его открываю, он выглядит отлично.
Мой следующий шаг – превратить его в загружаемую ссылку. Для этого я сделал следующее:
$mimeType = "application/vnd.ms-excel"; $file_name = "test.xls"; $file_path = "/tmp/".$file_name; header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-Type: application/' . $mimeType); header('Content-Length: '.$size); header("Content-Disposition: attachment;filename=$file_name "); header("Content-Transfer-Encoding: binary "); // open the file in binary read-only mode // display the error messages if the file can´t be opened $file = & fopen($file_path, 'rb'); if ($file) { // stream the file and exit the script when complete fpassthru($file); exit; } else { echo $err; }
Однако, когда я загружаю файл, он содержит много мусорных данных как в Excel, так и в OpenOffice. Дифф говорит, что тогда двоичный файл в папке / tmp и загруженном файле отличаются друг от друга. Я предполагаю, что это имеет какое-то отношение к заголовкам или fpassthru, но мне не очень повезло с отладкой проблемы.
Любые идеи о том, в чем проблема?
Несколько заголовков Content-Type не требуются. Вы, по сути, говорите, что файл – это кекс, пицца и форд-телец в одно и то же время. Все, что вам нужно, это версия application/octet-stream
, если вы не хотите использовать точный тип mime.
Кроме того, есть ли причина, по которой вы пытаетесь превратить дескриптор файла, возвращенный fopen()
в ссылку?
Попробуйте что-то более простое:
<?php header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment;filename=$file_name"); readfile("/tmp/test.xls"); exit(); ?>
и посмотрим, улучшится ли это.
Просто убедитесь, что вы не отправляете НИЧЕГО в браузер до того, как будет отправлено фактическое содержимое файла.
Это может быть просто ошибка «php» или даже «уведомление», которую производит Spreadsheet_Excel_Writer, и вы даже не видите. Или это может быть закрывающий тег??>, За которым следует простое пространство или новая строка.
У меня была аналогичная ошибка, когда файл, созданный внутри веб-папок, работал. Однако доставка с использованием заголовка ('…') дала мне поврежденные файлы. Это было связано с одним пространством в конце одного файла php после закрытия тега «?>».
Я использую одну и ту же библиотеку, и я только что обнаружил, что файлы в самой библиотеке создают пробелы.
Решение. В следующих файлах удалите пробелы в конце файла или удалите тег ?>
Закрытия в конце.
Файлы для редактирования (все файлы в Spreadsheet_Excel_Writer package
):
Writer.php Workbook.php Worksheet.php PPS.php Parser.php OLE.php Parser.php File.php BIFFWriter.php Validator.php Root.php
Добавьте следующий код вверху страницы, на которой генерируется файл excel
ob_clean ();
Это очистит все данные тарабарщины. Также проверяйте любые утверждения эха. Если присутствуют эхо-заявления, удалите их. Данные должны всегда отображаться в формате, указанном пакетом excel.