PHP 读取另一个扩展名的 MP4 文件
PHP read MP4 file with another extension
我在博物馆工作,我们的网站上有很多 .MP4 视频。我将它们的扩展名更改为 .MUS 以使其更难下载(大多数人不知道如何右键单击该网页,单击 <video>
标记下载它然后重命名)。视频显示正常。看起来像这样:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='dinos.mus'> ◄█■■■
</video>
现在我将视频移动到 WWW 之外的受保护目录,然后我使用 PHP 阅读它们,如下所示:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='open_file.php?file=dinos.mp4'> ◄█■■■
</video>
这是 open_file.php
:
header( "Content-Type: video/mp4" );
readfile( "/home/" . $_GET["file"] );
它工作正常...直到我将扩展名从 .MP4 更改为 .MUS,然后视频不再显示:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='open_file.php?file=dinos.mus'> ◄█■■■
</video>
我不明白为什么:这是同一个文件,我发送正确的 header 和 PHP,<video>
标签有正确的类型。实际上,如果没有 PHP,<video>
标签可以很好地处理 .MUS 文件,所以问题似乎是 PHP.
我的问题是:如何读取 .MUS 文件并将其发送以被解释为 MP4?
我认为 .MUS 文件的 MIME 类型是 application/octet-stream
header( "Content-Type: application/octet-stream" );
我已经测试了你的代码,Content-Type: video/mp4 和 readfile 应该可以工作(它应该与文件扩展名无关,想象一下如果你从 BLOB 中获取文件数据,它也应该工作)
但是如果home
目录是相对目录,那么请使用“./home/”而不是“/home/”
和
确保目录/文件权限设置正确。假设确保主目录是可执行的(主目录为 chmod a+x)并且 mus 文件是可读的(MUS 文件为 chmod a+r)
所以这个 open_file.php
有效:
<?php
header("Content-Type: video/mp4");
readfile("./home/" . $_GET["file"]);
?>
在此处查看工作示例:
http://www.createchhk.com/SO/testSO20Nov2021b.php
代码如下:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='open_file.php?file=test2.mus'>
</video>
这并不能真正保护文件。您可以通过将文件托管在另一台服务器上来保护该文件,缓冲视频,然后为下一个用户重命名该文件,有效地删除该文件,直到它被重新加载。不过,这需要一些时间来编写代码。
不过,执行此操作的另一种方法是使用 blob url。这些是 YouTube 使用的内容,它阻止人们轻松找到视频 URL。
您可以使用下面的 PHP 代码来执行此操作:
<?php // php at top of page
$video = file_get_contents('./location/to/file/from/page.mp4');
$video_code = base64_encode($video);
?>
然后,在你有视频文件的地方,你可以这样做:
<video width='640px' height='480px' controls='controls' controlslist='nodownload' />
<source type='video/mp4' src='<?php echo $video_code; ?>'>
</video>
如果有人试图抓取视频 URL 并打开它,它会告诉他们文件已被移动。他们也无法下载该文件。我还建议在视频中添加 oncontextmenu='return false;'
以提高安全性。
我在博物馆工作,我们的网站上有很多 .MP4 视频。我将它们的扩展名更改为 .MUS 以使其更难下载(大多数人不知道如何右键单击该网页,单击 <video>
标记下载它然后重命名)。视频显示正常。看起来像这样:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='dinos.mus'> ◄█■■■
</video>
现在我将视频移动到 WWW 之外的受保护目录,然后我使用 PHP 阅读它们,如下所示:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='open_file.php?file=dinos.mp4'> ◄█■■■
</video>
这是 open_file.php
:
header( "Content-Type: video/mp4" );
readfile( "/home/" . $_GET["file"] );
它工作正常...直到我将扩展名从 .MP4 更改为 .MUS,然后视频不再显示:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='open_file.php?file=dinos.mus'> ◄█■■■
</video>
我不明白为什么:这是同一个文件,我发送正确的 header 和 PHP,<video>
标签有正确的类型。实际上,如果没有 PHP,<video>
标签可以很好地处理 .MUS 文件,所以问题似乎是 PHP.
我的问题是:如何读取 .MUS 文件并将其发送以被解释为 MP4?
我认为 .MUS 文件的 MIME 类型是 application/octet-streamheader( "Content-Type: application/octet-stream" );
我已经测试了你的代码,Content-Type: video/mp4 和 readfile 应该可以工作(它应该与文件扩展名无关,想象一下如果你从 BLOB 中获取文件数据,它也应该工作)
但是如果home
目录是相对目录,那么请使用“./home/”而不是“/home/”
和
确保目录/文件权限设置正确。假设确保主目录是可执行的(主目录为 chmod a+x)并且 mus 文件是可读的(MUS 文件为 chmod a+r)
所以这个 open_file.php
有效:
<?php
header("Content-Type: video/mp4");
readfile("./home/" . $_GET["file"]);
?>
在此处查看工作示例:
http://www.createchhk.com/SO/testSO20Nov2021b.php
代码如下:
<video width='640px' height='480px' controls='controls' />
<source type='video/mp4' src='open_file.php?file=test2.mus'>
</video>
这并不能真正保护文件。您可以通过将文件托管在另一台服务器上来保护该文件,缓冲视频,然后为下一个用户重命名该文件,有效地删除该文件,直到它被重新加载。不过,这需要一些时间来编写代码。
不过,执行此操作的另一种方法是使用 blob url。这些是 YouTube 使用的内容,它阻止人们轻松找到视频 URL。
您可以使用下面的 PHP 代码来执行此操作:
<?php // php at top of page
$video = file_get_contents('./location/to/file/from/page.mp4');
$video_code = base64_encode($video);
?>
然后,在你有视频文件的地方,你可以这样做:
<video width='640px' height='480px' controls='controls' controlslist='nodownload' />
<source type='video/mp4' src='<?php echo $video_code; ?>'>
</video>
如果有人试图抓取视频 URL 并打开它,它会告诉他们文件已被移动。他们也无法下载该文件。我还建议在视频中添加 oncontextmenu='return false;'
以提高安全性。