 |  |
|
기본 파일 업로딩
비디오 조직화의 다음 단계는 실제 비디오를 몇 개 넣어 보는 것이다. 비디오 파일 업로드가 가능하도록 하려면 Add Video 액션의 행동과 뷰의 형식을 변경해야 한다. 모든 업로드 액션은 비디오 컨트롤러의 add 액션에 넣어지는데 우선 add 뷰를 수정해야 한다.
add 뷰
add 뷰에는 두 가지 중요한 변경이 있어야 하며, 그래야 나중에 많은 비디오를 업로드하게 된다. 무엇보다도 form->create 줄은 multipart 인코딩을 사용하도록 <?php echo $form->create('Video', array('enctype' => 'multipart/form-data'));?>와 같이 명시적으로 수정될 필요가 있다. 그리고 나서 위치 입력 필드를 파일 입력 필드로 다음과 같이 변경한다: echo $form->file('location');
이제 비디오 컨트롤러까지는 별 탈 없이 실제 업로드가 가능해진다. add 액션에서는 파일을 실제로 어딘가에 쓰기 작업을 하며, 데이터베이스에 저장하는 관련 데이터를 데이터베이스가 조작할 수 있는지, 그리고 나중에 검색이 가능하도록 이 데이터베이스가 파일의 위치를 담고 있는지 확인할 필요가 있다.
위치 필드를 파일 입력 컨트롤로 변경한 이래로 $this->data['Video']['location']은 하나의 배열을 담고 있다(일반적으로 $_FILES['userfile']에서 검색되는 정보와 동일). 배열을 데이터베이스에 있는 그대로 전달하려 하면 데이터베이스에서는 에러가 날 게 확실하다. 따라서 위치 배열에 저장된 중요 정보를 어디 다른 데에다 치워두고 업로드된 파일을 옮긴 후 파일의 새로운 위치를 $this->data['Video']['location'] 인자에 할당한다. 새로운 파일이 위치할 곳은 웹 서버가 쓰기 가능한 곳이 되어야 하며, 따라서 권한을 바꿔줘야 할지도 모른다. 모든 게 끝나면 무엇보다도 파일이 실제로 수신되었는지 점검해 봐야 한다. 그리고 난 후 실제 파일 쓰기로 가도록 하자.
Listing 17. 비디오 파일 저장
$new_video = $this->data['Video']['location'];
//name, type, tmp_name, error, size
$this->data['Video']['location'] = 'files/' . $user['id'] .
'_' . $new_video['name'];
if (is_uploaded_file($new_video['tmp_name'])) {
if (move_uploaded_file($new_video['tmp_name'], WWW_ROOT .
$this->data['Video']['location'])){
//nothing went wrong! Your file has been saved.
// Save data to the database as usual
}
}
|
$new_video 변수에는 지금 막 업로드한 파일 관련 정보가 들어있다. $this->data['Video']['location']에는 신규 파일의 경로가 들어있다. 만약 새로운 비디오가 무사히 업로드되었다면 $this->data['Video']['location']에 기술된 대로 새로운 위치로 바로 옮긴다.
이 uploading 함수는 절대로 다른 사람이 사용할 수 없어야 한다는 것도 말해둬야 할 것 같다. 여러분 서버에 파일을 넣을 수 있도록 허용하고 싶을 때엔 언제라도 예상했던 MIME 형식인지(type 변수 체크), 적당한 파일 확장자를 갖고 있는지도 살펴야 한다. 추가적으로 PHP를 설정해 두는 것도 쉽게 이런 작업의 일부가 될 것이다. 특히 max_execution_time과 upload_max_filesize를 설정하면 스크립트가 사용자들에게 정보를 줄만한 에러를 일으키지 않고 조용히 동작을 멈추도록 할 수 있다. PHP 설정을 직접 건드릴 수 없다면 ini_set 함수를 사용하는 것으로 즉석에서 우회하는 것이 가능하다.
먼 길을 왔다. 이젠 비디오 파일을 업로드할 수 있으며 웹으로 접근 가능한 위치에 비디오가 저장될 것이다. OS FLV 라이브러리와 CakePHP를 통합하여 이 모든 것을 한 데 합칠 때가 되었다. 이 작업이 끝나면 비디오를 재생할 수 있게 된다.
CakePHP와 OS FLV 라이브러리 통합하기
CakePHP로 OS FLV 라이브러리를 통합하는 게 끔찍히 어려운 일은 아니다. 일부 파일의 위치를 옮겨야 하기 때문에, 내용을 주의깊게 읽을 필요가 있다. http://www.osflv.com에서 OS FLV 라이브러리를 다운로드하고 압축 파일을 푼다. 다음과 같은 파일을 볼 수 있을 것이다.
Listing 18. OS FLV 라이브러리
AC_RunActiveContent.js
Firefox codegenerator.html
demo.php
flash/flash.php
flash/getid3.lib.php
flash/getid3.php
flash/module.audio-video.flv.php
flash/module.audio-video.swf.php
flash/module.tag.apetag.php
flash/module.tag.id3v1.php
flash/module.tag.id3v2.php
flash/module.tag.lyrics3.php
flash/write.apetag.php
flash/write.id3v1.php
flash/write.id3v2.php
player.fla
player.swf
player8.fla
player8.swf
rac.js
video.flv
|
OS FLV를 사용하기 위해 이 파일 모두가 있을 필요는 없다. 일부는 데모용이고 나머지는 도구들이다. flash 디렉터리의 파일을 app/vendors 디렉터리로 넣는다. 이렇게 하고 나면 CakePHP의 vendors 함수를 사용하는 것으로 필요한 라이브러리를 로드할 수 있게 된다. 예를 들어 기본 OS FLV 라이브러리를 로드하기 위해 App::import('Vendor', 'flash');라고 할 수 있다.
비디오 컨트롤러를 위한 view 액션에 이를 추가할 필요가 있을 것이다. 그래서 View Video 페이지에서 라이브러리를 호출할 수 있다. 이렇게 하면 상황에 맞는 브라우저에 맞는 자바스크립트를 포함하도록 OS FLV의 기본 라이브러리를 사용할 수 있게 될 것이다. 안타깝지만 mod_rewrite 같은 것들 때문에 OS FLV의 일부인 간단한 flvheader()와 flv() 함수를 사용할 수는 없다. 어쨌든 괜찮다. 손수 코드를 좀 작성할 수는 있다.
하지만 아직 거기까진 아니다. 플레이어가 기대했던 대로 동작하도록 하기 위해 파일을 몇 개 옮겨야 한다. 구체적으로 말해 AC_RunActiveContent.js, rac.js, player8.swf, player.swf 파일을 웹으로 접근 가능한 위치로 옮겨야 한다. 이 파일 네 개를 app/webroot/js 디렉터리로 복사한다.
이제 파일을 제 위치에 두었으니 View Video용 view 파일(app/views/videos/view.ctp)을 편집하자. 브라우저에 따른 스크립트를 임포트(import)하려면 코드를 좀 추가해야 한다. 보통 OS FLV에 대해서는 flvheader() 함수를 사용하는데 파일이 옮겨지면서 그렇게 할 수는 없다. 대신 적절한 자바스크립트를 사용하는지 확인하기 위해 OS FLV가 쓰는 동일한 테스트 방법을 사용할 수 있다.
Listing 19. 적절한 자바스크립트 확인
<?php
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
echo "<script src='/js/AC_RunActiveContent.js'
language='javascript'></script>";
else
echo "<script charset='ISO-8859-1' src='/js/rac.js'
language='javascript'></script>";
?>
|
다음에는 재생할 비디오에서 getflvsize() 함수를 호출할 필요가 있다. 이렇게 하여 적절한 크기로 표시할 수 있다: <?php $size = getflvsize(WWW_ROOT . $video['Video']['location']); ?>
마지막으로 플레이어와 비디오 파일을 함께 넣기 위해 embed 코드를 추가할 필요가 있다. Listing 20은 flv() 함수가 출력하는 것과 대체로 비슷하지만 우리 입맛에 맞추기 위해 인자를 받을 수 있게 했고 파일의 정확한 위치를 설정하도록 했다.
Listing 20. flv() 함수 출력
<script language='javascript'>
var src = '/js/player';
if(!DetectFlashVer(9, 0, 0) && DetectFlashVer(8, 0, 0))
src = '/js/player8';
AC_FL_RunContent('codebase',
'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
'width', <?php echo $size[0] ?>, 'height', <?php echo $size[1] ?>, 'src',
src, 'pluginspage',
'http://www.macromedia.com/go/getflashplayer', 'id', 'flvPlayer', 'allowFullScreen',
'true', 'movie', src, 'FlashVars','movie=/<?php echo
$video['Video']['location']?>&autoload=off&volume=70');
</script>
<noscript>
<object width='<?php echo $size[0] ?>' height='<?php echo $size[1] ?>'
id='flvPlayer'>
<param name='allowFullScreen' value='true'>
<param name='movie' value='/js/player.swf?movie=/
<?php echo $video['Video']['location']?>&autoload=off&volume=70'>
<embed src='/js/player.swf?movie=/<?php echo
$video['Video']['location']?>&autoload=off&volume=70'
width='<?php echo $size[0] ?>' height='<?php echo $size[1] ?>'
allowFullScreen='true'
type='application/x-shockwave-flash'>
</object>
</noscript>
|
모든 게 정확히 끝났다면 비디오 목록을 찾아 View를 클릭하는 것으로 전에 업로드된 파일을 보고 재생할 수 있을 것이다. 그림 4와 같이 나타날 것이다.
그림 4. 업로드된 비디오 보기와 재생
축하한다! 비디오 업로드가 끝났으며 이제 자유자재로 보고 공유할 수 있게 되었다.
|  |