MediaView.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. /**
  3. * Methods to display or download any type of file
  4. *
  5. * PHP 5
  6. *
  7. * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
  8. * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  9. *
  10. * Licensed under The MIT License
  11. * For full copyright and license information, please see the LICENSE.txt
  12. * Redistributions of files must retain the above copyright notice.
  13. *
  14. * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  15. * @link http://cakephp.org CakePHP(tm) Project
  16. * @package Cake.View
  17. * @since CakePHP(tm) v 1.2.0.5714
  18. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  19. */
  20. App::uses('View', 'View');
  21. App::uses('CakeRequest', 'Network');
  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 Deprecated since version 2.3, use CakeResponse::file() instead
  57. */
  58. class MediaView extends View {
  59. /**
  60. * Display or download the given file
  61. *
  62. * @param string $view Not used
  63. * @param string $layout Not used
  64. * @return boolean
  65. */
  66. public function render($view = null, $layout = null) {
  67. $name = $download = $id = $modified = $path = $cache = $mimeType = $compress = null;
  68. extract($this->viewVars, EXTR_OVERWRITE);
  69. $path = $path . $id;
  70. if (is_array($mimeType)) {
  71. $this->response->type($mimeType);
  72. }
  73. if ($cache) {
  74. if (!empty($modified) && !is_numeric($modified)) {
  75. $modified = strtotime($modified, time());
  76. } else {
  77. $modified = time();
  78. }
  79. $this->response->cache($modified, $cache);
  80. } else {
  81. $this->response->disableCache();
  82. }
  83. if ($name !== null) {
  84. $name .= '.' . pathinfo($id, PATHINFO_EXTENSION);
  85. }
  86. $this->response->file($path, compact('name', 'download'));
  87. if ($compress) {
  88. $this->response->compress();
  89. }
  90. $this->response->send();
  91. return true;
  92. }
  93. }