CakePHP 3, как рендерить без CTP

Как выполнить рендеринг без попытки моего контроллера загрузить несуществующий файл .ctp.

Это мой код:

        //without this, I get an error trying to load a non-existent .ctp file. When I include it, the browser does not render the PNG file.
        $this->autoRender = false;

        //... get avatar code

        if (!file_exists($avatarPath))
            throw new Exception('Could not find file: '.$avatarPath);

        $file = file_get_contents($avatarPath);

        header('Content-Type: image/png');
        if ($file === false)
            throw new Exception('file_get_contents failed on avatarPath');
        else
            echo $file;

Когда я использую $this->autoRender = false;, вызов header игнорируется. Любые идеи?


person toast    schedule 23.11.2016    source источник


Ответы (1)


Прочтите о как отправлять файлы с помощью CakePHP. . Позвольте процитировать вам документацию:

Бывают случаи, когда вы хотите отправлять файлы в качестве ответов на ваши запросы. Вы можете сделать это, используя

public function sendFile($id)
{
    $file = $this->Attachments->getFile($id);
    $this->response->file($file['path']);
    // Return response object to prevent controller from trying to render
    // a view.
    return $this->response;
}

Как показано в приведенном выше примере, вы должны передать путь к файлу методу. CakePHP отправит правильный заголовок типа контента, если это известный тип файла, указанный в Cake \ Network \ Reponse :: $ _ mimeTypes. Вы можете добавлять новые типы до вызова Cake \ Network \ Response :: file () с помощью метода Cake \ Network \ Response :: type ().

Если вы хотите, вы также можете принудительно загрузить файл вместо отображения в браузере, указав параметры:

$this->response->file(
    $file['path'],
    ['download' => true, 'name' => 'foo']
);
person floriank    schedule 24.11.2016
comment
Спасибо. После этого я получил сообщение об ошибке: запрошенный файл содержит .. и не будет прочитан. - Чтобы исправить это, мне пришлось раньше менять каталоги, а потом переключаться обратно :( - person toast; 24.11.2016
comment
Это проверка безопасности для предотвращения атак обхода каталогов. - person floriank; 24.11.2016