2016-10-25 3 views
1

J'utilise la classe VideoStream et ça marche très bien. J'essaie de l'intégrer à l'intérieur d'un Page_Controller et de sécuriser le téléchargement de la vidéo. Ainsi, chaque fois que la page est chargée, le lien vidéo change toujours lors du rechargement et personne ne peut le télécharger directement depuis l'URL du navigateur.Classe PHP VideoStream dans SilverStripe

Mais la classe ne semble pas fonctionner et je ne sais pas ce que j'ai manqué. J'utilise également le module ChunkedUpload pour télécharger de gros fichiers dans le CMS.

Des idées pour utiliser cette classe?

Voici mon code.

Note: Mon code fonctionne, j'ai note ci-dessous "mon original ..."

PageVideo.ss

<video controls preload="auto" id="video1"> 
    <% if $VideoMP4 %><source src="id/$Video($VideoMP4.ID)" type="video/mp4"><% end_if %> 
    Your browser does not support HTML5 video. 
</video> 

PageVideo.php

class PageVideo extends Page { 

    private static $has_one = array(
     'VideoMP4' => 'File' 
    ); 

    function getCMSFields() { 
     $fields = parent::getCMSFields(); 

     $fields->addFieldToTab(
      'Root.Main ', 
      $uploadField = new ChunkedUploadField(
       $name = 'VideoMP4', 
       $title = "VideoMP4" 
      ) 
     ); 

     $uploadField->setFolderName('Uploads/videos/'); 
     $uploadField->setDisplayFolderName('Uploads/videos'); 
     $uploadField->getValidator()->allowedExtensions = array("mp4"); 

     $sizeMB = 500 * 1024 * 1024; // 500 MB in bytes 
     $uploadField->getValidator()->setAllowedMaxFileSize($sizeMB); 
     $uploadField->setConfig('maxChunkSize', .05 * 1024 * 1024); 

     return $fields; 
    } 
} 

class PageVideo_Controller extends Page_Controller { 

    private static $allowed_actions = array('VideoGrab'); 
    private static $url_handlers = array('id/$hash' => 'VideoGrab'); 

    public function VideoGrab(SS_HTTPRequest $request) { 

     $hash = $request->param('hash'); 

     $file = File::get()->filter('ID', $_SESSION['keyID'])->first(); 

     if (md5($file->Name . $_SESSION['key']) == $hash) { 

      $_SESSION['key'] = ""; 
      $_SESSION['keyID'] = ""; 

      //**************** HERE IS THE CLASS ********************* 
      include "libraries/VideoStream.php"; 
      $stream = new VideoStream($file->AbsoluteURL); 
      $stream->start(); 
      exit; 

      // the original php working just for some browsing and bad codes 
      /* 
      $ext = pathinfo($file->Filename); 
      header('Cache-control: private'); 
      header('Content-Type: video/' . $ext['extension']); 
      header('Accept-Ranges: bytes'); 
      header("Content-Transfer-Encoding: binary"); 

      return readfile($file->AbsoluteURL); 
      exit; 
      */ 
     } else { 
      return $this->httpError(404, "Not Found"); 
     } 
    } 

    public function Video($n) { 

     $file = File::get()->filter('ID', $n)->First(); 
     $_SESSION['key'] = time(); 
     $_SESSION['keyID'] = $file->ID; 

     return md5($file->Name . $_SESSION['key']); 
    } 
} 
+0

Quel est le code source de la page de résultats (partie vidéo)? Aviez-vous les valeurs attendues sur l'attribut src = "" de ? –

+0

la source vidéo VideoMP4 est conservée par le tableau has_one dans le modèle de page. Avez-vous eu de l'expérience avec Silverstripe? – StefGuev

+0

@ 3dgoo, merci de nettoyer mon anglais et les codes! Avez-vous une réponse? Vous semblez être un gourou du codage Silverstripe. – StefGuev

Répondre

0

ici est un moyen de le faire.

Classe

class PageVideo extends Page { 

    private static $has_one = array(
     'VideoMP4' => 'File' 
    ); 

    function getCMSFields() { 
     $fields = parent::getCMSFields(); 

     $fields->addFieldToTab('Root.Video', $uploadField = UploadField::create('VideoMP4')); 

     $uploadField->setFolderName('Uploads/videos/'); 
     $uploadField->getValidator()->allowedExtensions = array('mp4'); 

     return $fields; 
    } 
} 

class PageVideo_Controller extends Page_Controller { 

    private static $allowed_actions = array(
     'VideoStream' 
    ); 

    function VideoStream() { 
     if ($this->VideoMP4()->exists()) { 
      include 'libraries/VideoStream.php'; 
      $stream = new VideoStream($this->VideoMP4()->getFullPath()); 
      return $stream->start(); 
     } 
     return false; 
    } 
} 

Modèle

<% if $VideoMP4 %> 
<video controls preload="auto" id="video1"> 
    <source src="{$Link}VideoStream" type="video/mp4"> 
    Your browser does not support HTML5 video. 
</video> 
<% end_if %> 
+0

Fonctionne comme un charme !!! Je dois juste remplacer ma variable $ stream par la vôtre. $ stream = new VideoStream ($ this-> VideoMP4() -> getFullPath()); merci et merci beaucoup. Je ne connaissais pas la commande getFullPath(). – StefGuev