Link to home
Start Free TrialLog in
Avatar of rooseveltrp
rooseveltrp

asked on

Streaming mpeg files via PHP (files outside of www or public_html folder)

Hello there,
I am trying to built a pretty powerful cms but really stuck in this small part and can't figure out how to do this. I have some .mpg clips stored under /home/myusername/clips/. So you will see the folder clips is not under the www or public_html folder.

At the moment I am just testing if I can play the media files outside of the www folder and here's what my quick PHP file looks like.

<?php

echo
"
<object id=\"MediaPlayer\" width=320 height=286 classid=\"CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95\" standby=\"Loading Windows Media Player components...\" type=\"application/x-oleobject\" codebase=\"http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112\">

<param name=\"filename\" value=\"/home/myname/clips/test.mpg\">
<param name=\"Showcontrols\" value=\"True\">
<param name=\"autoStart\" value=\"True\">

<embed type=\"application/x-mplayer2\" src=\"http://media.pmcmovies.com/SixtiesLove.wmv\" name=\"MediaPlayer\" width=320 height=240></embed>

</object>
";

?>

You will see the filename parameter has the full path to the file... for some reason it isn't working. I am sure there is a way to play this file, and will really appreciate if someone could help me out here :).
Avatar of VoteyDisciple
VoteyDisciple

All you've done there is output a bunch of HTML; it's no different than if you'd written that code statically (i.e. not using PHP at all).  When the web browser receives this, all it sees is a <param name="filename" value="/home/myname/clips/test.mpg" /> tag and it's no more able to retrieve the file than it was before.

I'm sure you envisioned originally that since PHP can access files outside the www or public_html directories, it ought to be able to serve up the file.  That's true; it sure can (with some restrictions), but it has to serve the VIDEO file, not necessarily the HTML file.

As a quick-and-dirty way to do it, create a script in www called, say, movie.php that works like this:

<?php readfile('/home/myname/clips/' . $_GET['filename']); ?>

This tiny bit of code just goes to whatever filename is in the 'filename' URL arguemtn and dumps the whole thing to the browser.


Then, your HTML will contain <param name="filename" value="/movie.php?filename=test.mpg" />


A couple things to note:
1.  If PHP Safe Mode is on, then the script will not be able to access any files anywhere on the filesystem that are owned by anybody other than the owner of the script.  So, if bjones owns the script, then it can only open other files bjones opens.

Usually PHP scripts execute as 'nobody', so if the 'nobody' user doesn't have access to the file then it's off-limits no matter what.  That's just logical.

2.  Make darn sure you're validating that the "filename" passed in is really a valid path to a movie.  The way I've written it, that script will gleefully spit out any public file on your server, making your system pretty darn exposed to hackers.  I imagine you'd want to avoid that, eh?

Avatar of rooseveltrp

ASKER

Hi VoteyDisciple,
Thanks for the attempt and I understood your concept completely. But still the file fails to load... may be something in the server is restricting it.

Here is what my PHP file looks like (named it player.php):

<?php

$path = "/home/name/clips/";

switch ($_GET['id'])
{
      case 1:
            $filename = "test.mpg";
            break;
      default:
            $filename =  "BLANK";
            break;
}

$filelocation = $path.$filename;

if (file_exists($filelocation))
{
      readfile($filelocation);
}
else
{
      echo "Invalid Media File!";
}

?>

and here's my HTML file which actually plays the media:

<object id="MediaPlayer" width=320 height=286 classid="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95" standby="Loading Windows Media Player components..." type="application/x-oleobject" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112">

<param name="filename" value="player.php?id=1">
<param name="Showcontrols" value="True">
<param name="autoStart" value="True">

<embed type="application/x-mplayer2" src="http://media.pmcmovies.com/SixtiesLove.wmv" name="MediaPlayer" width=320 height=240></embed>

When I load the HTML file in the web browser it keeps loading something but doesn't display the clip. To test I visited by the PHP file like this http://myurl.com/player.php?id=1 and it automatically launched Windows Media Player but kept loading something but not the clip.

In addition I've checked my php.ini file and safe_mode is turned OFF.
ASKER CERTIFIED SOLUTION
Avatar of VoteyDisciple
VoteyDisciple

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial