toast toast - 14 days ago 5
PHP Question

CakePHP 3, how to render without CTP

How do I render without my controller attempting to load a non-existent .ctp file.

This is my code:

//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;


When I use
$this->autoRender = false;
, the
header
call appears to be ignored. Any ideas?

Answer

Read about how to send files with CakePHP. Let quote read the documentation for you:

There are times when you want to send files as responses for your requests. You can accomplish that by using

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;
}

As shown in the above example, you must pass the file path to the method. CakePHP will send a proper content type header if it’s a known file type listed in Cake\Network\Reponse::$_mimeTypes. You can add new types prior to calling Cake\Network\Response::file() by using the Cake\Network\Response::type() method.

If you want, you can also force a file to be downloaded instead of displayed in the browser by specifying the options:

$this->response->file(
    $file['path'],
    ['download' => true, 'name' => 'foo']
);