2016-10-25 9 views
1

Я использую класс VideoStream, и он работает очень хорошо. Я пытаюсь интегрировать его внутри Page_Controller и защищать видео от загрузки. Таким образом, каждый раз, когда страница загружается, видеосвязь всегда изменяется при перезагрузке, и никто не может ее загрузить напрямую из URL-адреса браузера.PHP VideoStream класс в SilverStripe

Но класс не работает, и я не знаю, что я пропустил. Я также использую модуль ChunkedUpload для загрузки больших файлов в CMS.

Любые идеи, как использовать этот класс?

Вот мой код.

Примечание: Мой код работает я примечание ниже "мой оригинальный ..."

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

Что исходный код страницы результатов (видео часть)? Были ли у вас ожидаемые значения атрибута src = "" ? –

+0

Источник видеосигнала VideoMP4 поддерживается массивом has_one в модели страниц. У вас был опыт работы с Silverstripe? – StefGuev

+0

@ 3dgoo, спасибо за очистку моего английского и кодов! У вас есть ответ? Вы, кажется, гуру кодировки Silverstripe. – StefGuev

ответ

0

Здесь это один из способов сделать это.

Класс

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

Шаблон

<% 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

Работает как шарм !!! Я просто хочу заменить мою переменную $ stream на вашу. $ stream = new VideoStream ($ this-> VideoMP4() -> getFullPath()); спасибо и спасибо большое. Я не знал команду getFullPath(). – StefGuev