• 5712阅读
  • 0回复

在网页播放多媒体文件时防止取得实际URL [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-07-30
在网页中播放多媒体文件时,要指定一个SRC属性,这个SRC属性可以设置为一个专门的处理文件,而这个专门的文件对用户的请求进行控制,准予通过的,然后这个文件二进制读取实际的多媒体文件,然后发送回去。
不过,这只对小文件有效,对大文件,比如MTV,电影等,不可行,因为它们太大了,几百M要。
要播放的网页:

<html>
<body>
<embed type="video/x-ms-wmv" autostart="true" loop="0" src="getfile.php"
showstatusbar="0" showdisplay="0" EnableContextMenu="1" showcontrols="0"/>
</body>
</html>



这个是处理多媒体文件的getfile.php
<?php
$file="file:///D:/www/ok-99.wmv";//......你的下载路径根目录
if(!file_exists($file)){echo "对不起,此链接已经失效,请在下载页面上向我们报告,谢谢!";exit;} //......测试文件是否存在
$filename=$file;
//  发送文件头信息
header("Cache-control: private"); // fix for IE
header("Content-Type: application/octet-stream");
header("Content-Length: ".filesize($filename));
header("Content-Disposition: attachment; filename=$filename");
$fp = fopen($filename, 'r'); // 以读取方式打开指定文件
fpassthru($fp); // ** CORRECT ** 以二进制方式读取文件
fclose($fp); // 关闭文件
?>


当然,对于大文件,用上述方法就不行了,因为不可能一次就读完(几百M啊)
所以可以用下面的方法分段读取:

$file="file:///D:/www/01.wmv";
if(!file_exists($file)){echo "对不起,此链接已经失效,请在下载页面上向我们报告,谢谢!";exit;} //..
$filename=$file;
//  发送文件头信息
header("Cache-control: private"); // fix for IE
header("Content-Type: application/octet-stream");
header("Content-Length: ".filesize($filename));
header("Content-Disposition: attachment; filename=$filename");
$handle = fopen($filename, 'rb'); // 以读取方式打开指定文件
do
{
  $data = fread($handle, 8192);
  if (strlen($data) == 0)
  {
    break;
  }
  echo($data);
}while(true);
fclose($handle);


不过。对于RM格式的文件,网页就不能正常播放了。


上面的发送文件内容的程序,有一个问题,在Mozilla系列浏览器下文件名和IE下面的文件名不一样,甚至会出现,连后缀也没有的情愿,怎么样让它显示正确的文件名呢?
在发送名的时候,一定要把那个文件名处理了,把目录处理掉。

header("Content-Disposition: attachment; filename=$filename");
改为:
header("Content-Disposition: attachment; filename=" . basename($filename));
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个