У меня очень странное поведение при отправке zip-архива, содержащего файлы любого типа в symfony.Проблема в том, что zip-файл, который я загружаю из браузера, содержит дополнительный «бит» в начале файла.
Вот мой код:
$tmpFileName = tempnam("/tmp", "xb_");
$zip = new ZipArchive();
$zip->open($tmpFileName, ZipArchive::CREATE);
$zip->addFile('[directory_inside_webspace]/test.pdf', 'myTest.pdf');
$zip->close();
$this->getResponse()->clearHttpHeaders();
$this->getResponse()->setContent(file_get_contents($tmpFileName));
$this->getResponse()->setHttpHeader('Content-Type', 'application/zip');
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename=archive.zip');
return sfView::NONE;
Теперь вот чтостранный.С временным zip-файлом в / tmp все в порядке.Я могу извлечь его без проблем.Но файл, который браузер отправляет мне, поврежден.Когда я открываю их оба в шестнадцатеричном редакторе, первые несколько байтов выглядят так:
working file: 50 4B 03 04 14 00 00
corrupt file: 0A 50 4B 03 04 14 00 00
Когда я удаляю добавление '0A' из поврежденного файла, я могу открыть его без проблем.Теперь это точно такой же файл, как файл tmp, созданный в /tmp.
У кого-нибудь было такое поведение раньше ??Я застрял в этой проблеме более 4 дней, и я не могу найти ошибку.Я использую точно такой же код в другом модуле Symfony, и он работает там.Есть идеи?
----- Обновление ------
Проблема не связана с zipArchive или setContent.У меня был запрос в начале функции.
$bill = Doctrine::getTable('Bill')->find($request->getParameter('id'));
В классе 'Bill.class.php' в моей модели доктрины до
<?php
была пустая строка.когда был создан экземпляр класса Bill, новая строка была выведена на экран.
Мне просто интересно, почему php не выдает сообщение об ошибке типа «заголовки уже отправлены» при отправке архива zip в браузер.