2011-09-16 4 views
1

私はいくつかのmp3ファイルをストリーミングするオーディオフラッシュプレーヤーを備えたページを持っています。このプレーヤーは、webrootディレクトリのオーディオフォルダにあるすべてのファイルのパスを持つXMLファイルを使用します。CakePHP:フラッシュプレーヤーでストリーミングされたmp3ファイルのメディアビュー

私が気に入らないのは、ユーザーがXMLファイル(webrootディレクトリにもあります)にアクセスし、mp3ファイルのパスを確認してから、単にダウンロードするのではなくダウンロードすることですフラッシュプレーヤー。

CakePHPにはというメディアビューという名前があります.Webrootの外にフォルダを設定してそこにファイルを置くことができ、ユーザは自由にアクセスすることができません。 Cakeのウェブサイト(http://book.cakephp.org/view/1094/Media-Views)の説明は、ダウンロードするファイルに焦点を当てていますが、私はMedia Viewsを使って自分のmp3ファイルをユーザーがダウンロードすることはできません。または、メディアビューがなくてもうまくいく他の方法があれば:)

ありがとうございます!

明確化

これは私が変更したいことを使用しているコードです:

- 私のコントローラでは:

function index() {} 

- 私の見解では(index.ctp):

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

=>私のmp3ファイルがapp/webroot/audiosではなくfolder app/audiosにあるように、Media Viewsを使ってどのように変更できますか?

これは私が試したWHAT IS:

を - 私のコントローラ(streams_controller.php)では: - :

私の意見(index.ctp)で

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

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

静止していません!私は間違って何をしていますか?

答えて

1

ここに必要なのはメディアビューのようです。それはあなたがWebrootの外にmp3を移動することができます。 オプションで「ダウンロード」キーがtrueになった場合にのみ、Cakeはダウンロードを強制するヘッダーを送信します。

falseに設定すると動作する可能性があります。

+0

代わりにファイルのページをダウンロードするかどうかを確認するだけという、私はダウンロードキーで「偽の」で試してみたが、ダウンロードダイアログがまだ表示されます。 – Albert

0

私は、デフォルトで、Webルートファイルパスまたは/ controller/actionパスからどちらかの方法でファイルをダウンロードできると考えています。

しかし、これは簡単に解決できます。いくつかのセキュリティ実装があります。

注:あなたはいくつかの並べ替えの許可を使用している場合は、私の意見では、あなたは自分の[「ユーザー」] [「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); 
} 
+0

あなたのコードをありがとうが、私はダウンロードするためのフォルダにファイルを配置する場合は、それが動作するように見えます。私はちょうどフラッシュプレーヤーが別のフォルダでそれらを見つけるようにしたい... – Albert

0

CakePHPの3倍のメディアに基づくハッシュ必要があります($ this-> request->(['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; 
} 
関連する問題