silentvick
@silentvick

Zend Framework 2: как программно отдать файл?

Использую Zend Framework 2.4. Пытаюсь в action-е отдать файл. Делаю так:

public function downloadAction()
{
    // $file = ...;

    $response = new \Zend\Http\Response\Stream();
    $response->setStream(fopen($file, 'r'));
    $response->setStatusCode(200);
    $response->setStreamName(basename($file));
    $response->setContentLength(filesize($file));

    $headers = new \Zend\Http\Headers();
    $headers->addHeaderLine('Content-Type', 'application/octet-stream')
            ->addHeaderLine('Content-Disposition', 'attachment; filename="'.basename($file).'"')
            ->addHeaderLine('Content-Transfer-Encoding', 'binary')
            ->addHeaderLine('Content-Length', filesize($file))
            ->addHeaderLine('Cache-Control', 'must-revalidate')
            ->addHeaderLine('Pragma', 'public');

    $response->setHeaders($headers);

    return $response;
}


Файл существует и доступен для чтения. Но загружается битым (не открывается). Размер совпадает. В чем тут может быть проблема?
  • Вопрос задан
  • 306 просмотров
Решения вопроса 1
silentvick
@silentvick Автор вопроса
В общем, проблема оказалась в том, что в тело ответа - в начало - добавляется пробел (символ 0x20). В результате все содержимое файла смещалось на один байт: в начало добавлялся байт пробела, а последний байт вовсе не читался, так как выходил за рамки, указанные в Content-Length.

Решилось вызовом ob_clean(); перед отправкой ответа.

Откуда берется этот несчастный пробел я пока не понял (возможно, у кого-то будут предположения?). Грешил сначала на закрывающий тег ?> в конце какого-нибудь файла, прошелся grep-ом, но не нашел ничего такого.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы