简体   繁体   中英

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?

Read about how to send files with CakePHP. Let me quote 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']
);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM