1: <?php
2: /**
3: * Methods to display or download any type of file
4: *
5: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
6: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
7: *
8: * Licensed under The MIT License
9: * For full copyright and license information, please see the LICENSE.txt
10: * Redistributions of files must retain the above copyright notice.
11: *
12: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
13: * @link https://cakephp.org CakePHP(tm) Project
14: * @package Cake.View
15: * @since CakePHP(tm) v 1.2.0.5714
16: * @license https://opensource.org/licenses/mit-license.php MIT License
17: */
18:
19: App::uses('View', 'View');
20: App::uses('CakeRequest', 'Network');
21:
22: /**
23: * Media View provides a custom view implementation for sending files to visitors. Its great
24: * for making the response of a controller action be a file that is saved somewhere on the filesystem.
25: *
26: * An example use comes from the CakePHP internals. MediaView is used to serve plugin and theme assets,
27: * as they are not normally accessible from an application's webroot. Unlike other views, MediaView
28: * uses several viewVars that have special meaning:
29: *
30: * - `id` The filename on the server's filesystem, including extension.
31: * - `name` The filename that will be sent to the user, specified without the extension.
32: * - `download` Set to true to set a `Content-Disposition` header. This is ideal for file downloads.
33: * - `path` The absolute path, including the trailing / on the server's filesystem to `id`.
34: * - `mimeType` The mime type of the file if CakeResponse doesn't know about it.
35: * Must be an associative array with extension as key and mime type as value eg. array('ini' => 'text/plain')
36: *
37: * ### Usage
38: *
39: * ```
40: * class ExampleController extends AppController {
41: * public function download() {
42: * $this->viewClass = 'Media';
43: * $params = array(
44: * 'id' => 'example.zip',
45: * 'name' => 'example',
46: * 'download' => true,
47: * 'extension' => 'zip',
48: * 'path' => APP . 'files' . DS
49: * );
50: * $this->set($params);
51: * }
52: * }
53: * ```
54: *
55: * @package Cake.View
56: * @deprecated 3.0.0 Deprecated since version 2.3, use CakeResponse::file() instead
57: */
58: class MediaView extends View {
59:
60: /**
61: * Display or download the given file
62: *
63: * @param string $view Not used
64: * @param string $layout Not used
65: * @return void
66: */
67: public function render($view = null, $layout = null) {
68: $name = $extension = $download = $id = $modified = $path = $cache = $mimeType = $compress = null;
69: extract($this->viewVars, EXTR_OVERWRITE);
70:
71: $path = $path . $id;
72:
73: if (is_array($mimeType)) {
74: $this->response->type($mimeType);
75: }
76:
77: if ($cache) {
78: if (!empty($modified) && !is_numeric($modified)) {
79: $modified = strtotime($modified, time());
80: } else {
81: $modified = time();
82: }
83: $this->response->cache($modified, $cache);
84: } else {
85: $this->response->disableCache();
86: }
87:
88: if ($name !== null) {
89: if (empty($extension)) {
90: $extension = pathinfo($id, PATHINFO_EXTENSION);
91: }
92: if (!empty($extension)) {
93: $name .= '.' . $extension;
94: }
95: }
96: $this->response->file($path, compact('name', 'download'));
97:
98: if ($compress) {
99: $this->response->compress();
100: }
101: }
102:
103: }
104: