CakePHP: мультимедийные представления для mp3-файлов, передаваемых с помощью флеш-плеера - PullRequest
1 голос
/ 16 сентября 2011

У меня есть страница с аудиоплеером, который транслирует несколько mp3-файлов.Этот проигрыватель использует XML-файл, который содержит путь ко всем этим файлам, которые находятся в папке audio в каталоге webroot.

Что мне не нравится, так это то, что это довольно легкопользователь, чтобы получить доступ к XML-файлу (который также находится в каталоге webroot) и посмотреть пути к mp3-файлам, а затем загрузить их, а не просто использовать флэш-плеер.

Я видел этот CakePHPесть что-то под названием Media Views , где вы можете установить папку вне webroot и поместить туда свои файлы, чтобы пользователи не могли свободно обращаться к ним.Объяснение на веб-сайте Cake (http://book.cakephp.org/view/1094/Media-Views) сосредоточено на загружаемых файлах, но я хотел бы знать, могу ли я использовать Media Views для потоковой передачи своих mp3-файлов с помощью аудиоплеера, не делая их загружаемыми пользователями.другая альтернатива без Media Views, которая также будет работать:)

Заранее большое спасибо!

УТОЧНЕНИЕ

Это код, который я 'используя его, я хотел бы изменить:

- В моем контроллере:

function index() {}

- На мой взгляд (index.ctp):

<embed type="application/x-shockwave-flash" flashvars="audioUrl=/audios/01 Track 01.mp3" src="audio-player.swf"></embed>

=> Как я могу изменить это с помощью Media Views, чтобы мой mp3-файл находился в папке app / audios вместо app / webroot / audios?

THISЧТО Я ПРОБОВАЛ:

- В моем контроллере (streams_controller.php):

function index() {}

function getFile() {

    $this->view = 'Media';

    $params = array(
                    'id' => '01 Track 01.mp3',
                    'name' => '01 Track 01',
                    'download' => false,
                    'extension' => 'mp3',
                    'path' => APP . 'audios' . DS,
                    'cache' => true
                    );

    $this->set($params);
}

- На мой взгляд (индекс.ctp):

<embed type="application/x-shockwave-flash" flashvars="audioUrl=/streams/getFile" src="audio-player.swf"></embed>

ЕЩЕ НЕ УДАЧИ!Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Представление Media, кажется, то, что вам нужно здесь.Это позволит вам переместить mp3 вне webroot.Cake отправит заголовки для принудительной загрузки, только если вы передадите true для ключа загрузки в опциях.

Просто установите для false значение false, и это может сработать.

0 голосов
/ 07 декабря 2017

Cakephp 3x медиа-файлы фарс для загрузки

если ($ this-> request-> is (['post'])) {$ data = $ this-> request-> data;

 // $file_name= 'test.mp4';
 $file_name = $data['files'];
 $this->viewClass = 'Media';

  $file_path = WWW_ROOT . 'files/video/' . DS . $file_name;
 //showing the path to the server where the file is to be download
 $this->response->file($file_path, array(
    'download' => true,
    'name' => $file_name,
 ));
 return $this->response;

 exit;
}
0 голосов
/ 16 сентября 2011

Я думаю, по умолчанию пользователь сможет загрузить файл любым способом, из пути к файлу webroot или из пути / controller / action.

Но это легко преодолеть с помощьюпара реализаций безопасности.

ПРИМЕЧАНИЕ: по моему мнению, если вы используете какую-либо авторизацию, вы должны хешировать на основе их ['User'] ['id'] вместо их IP

/**
* Action to download special assets
* example link to download <?php echo $this->Html->link('Link Text', array('action' => 'download', Security::hash('filedownloadsalt'.date('d').env('REMOTE_ADDR')), $filename), array('escape' => false)); ?>
* example URL to download <?php echo $this->Html->url(array('action' => 'download', Security::hash('filedownloadsalt'.date('d').env('REMOTE_ADDR')), $filename)); ?>
* @param string $hash
* @param string $filename
*/
function download($hash=null, $filename=null) {
    // check to ensure that the input hash is specific to this user and created today
    if (Security::hash('filedownloadsalt'.date('d').env('REMOTE_ADDR'))!=$hash) {
        $this->Session->setFlash("Sorry, you are not allowed access to this asset");
        return $this->redirect(array('action' => 'failure'));
    }
    // check to ensure referrer URL is on this domain
    if (strpos(env('HTTP_REFERER'), env('HTTP_HOST'))===false) {
        $this->Session->setFlash("Sorry, you must access this asset from within my site, not directly");
        return $this->redirect(array('action' => 'failure'));
    }
    // now get the asset
    $filenameParts = explode('.', $filename);
    $filenameExt = array_pop($filenameParts);
    $filenameBase = implode('.', $filenameParts);
    $this->view = 'Media';
    $params = array(
        'id' => $filename,
        'name' => $filenameBase,
        'download' => true,
        'extension' => strtolower($filenameExt),
        'path' => APP . 'files' . DS,   // don't forget terminal 'DS'
        'cache' => true,
        );
    $this->set($params);
}
...