У меня очень странное поведение при отправке 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-архива в браузер.