我正在播放mp3格式的音频和mp4格式的视频,但想使用PHP隐藏网址。我遵循了PHP: How can I block direct URL access to a file, but still allow it to be downloaded by logged in users?。
HTML代码
<audio controls>
<source src="get_song.php?name=my-song-name" type="audio/mpeg">
Your browser does not support the audio element.
</audio>
<video controls>
<source src="get_video.php?name=my-video-name" type="video/mp4">
Your browser does not support the video element.
</video>
PHP
get_song.php
if( !empty( $_GET['name'] ) )
{
// check if user is logged
if( is_logged() )
{
$song_name = preg_replace( '#[^-\w]#', '', $_GET['name'] );
$song_file = "
{$_SERVER['DOCUMENT_ROOT']}/members/files/{$song_name}.mp3";
if( file_exists( $song_file ) )
{
header( 'Cache-Control: public' );
header( 'Content-Description: File Transfer' );
header( "Content-Disposition: attachment; filename={$song_file}" );
header( 'Content-Type: application/mp3' );
header( 'Content-Transfer-Encoding: binary' );
readfile( $song_file );
exit;
}
}
}
die( "ERROR: invalid song or you don't have permissions to download it." );
get_video.php
if( !empty( $_GET['name'] ) )
{
// check if user is logged
if( is_logged() )
{
$video_name = preg_replace( '#[^-\w]#', '', $_GET['name'] );
$video_file = "
{$_SERVER['DOCUMENT_ROOT']}/members/files/{$video_name}.mp4";
if( file_exists( $song_file ) )
{
header( 'Cache-Control: public' );
header( 'Content-Description: File Transfer' );
header( "Content-Disposition: attachment; filename={$video_file}" );
header( 'Content-Type: application/mp4' );
header( 'Content-Transfer-Encoding: binary' );
readfile( $video_file );
exit;
}
}
}
die( "ERROR: invalid song or you don't have permissions to download it." );
但是问题是音频流需要很多时间才能流到中间并从头开始循环播放。此外,视频无法在移动设备上加载。标头有问题吗?正确的标题是什么?
我在这里找到了另一个解决方案,但是仍然无法加载视频,并且音频回送。 Hide audio url in PHP:
$filename = '/path/to/audio.mp3';
if(is_file($filename))
{
header('Content-Type: audio/mpeg');
header('Content-Disposition:
inline;filename="'.basename($filename).'"');
header('Content-length: '.filesize($filename));
header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: chunked");
readfile($filename);
}
$videoname = '/path/to/video.mp4';
if(is_file($videoname))
{
header('Content-Type: video/mp4');
header('Content-Disposition:
inline;filename="'.basename($videoname).'"');
header('Content-length: '.filesize($videoname));
header('Cache-Control: no-cache');
header("Content-Transfer-Encoding: chunked");
readfile($videoname);
}
内容传输编码块和二进制之间有什么区别?音频和视频的正确标题是什么?