使用PHP保护音频文件

时间:2016-03-06 16:54:33

标签: php audio

我想用PHP保护文件。现在我有这个代码,它能够提供可恢复的下载:

$file_info = finfo_open();
$file_mime = finfo_file($file_info, $file_path, FILEINFO_MIME_TYPE);
$file_size = filesize($file_path);
$file_time = filemtime($file_path);
$etag = md5($file_size . $file_time);

ini_set("zlib.output_compression", "Off");

header("Accept-Ranges: bytes");
header("Content-Disposition: inline");
header("Etag: {$etag}");
header("Last-Modified: " . gmdate("D, d M Y H:i:s T", $file_time));
header("Cache-Control: public, must-revalidate");

if($_SERVER["HTTP_IF_NONE_MATCH"] == $etag) {
    header("HTTP/1.1 304 Not Modified");
}
else {
    set_time_limit(0);
    $file = fopen($file_path, "r");

    if($_SERVER["HTTP_RANGE"]) {
        preg_match("/bytes=(\d+)-(\d+)?/", $_SERVER["HTTP_RANGE"], $matches);
        $length = $matches[2] - $matches[1];
        fseek($file, $matches[1]);

        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: " . ($matches[2] - $matches[1]));
        header("Content-Range: bytes {$matches[1]}-{$matches[2]}/{$file_size}");
    }
    else {
        header("Content-Length: {$file_size}");
    }
    header("Content-Type: {$file_mime}");

    while(!feof($file) && !connection_status()) {
        echo fread($file, 8192);
        ob_flush();
        flush();        
    }
    fclose($file);
}

这适用于所有类型的文件 - 音频(以及视频)文件除外。

它适用于Firefox,Safari会抛出错误(无法加载资源)但无论如何播放,Chrome和Opera拒绝播放任何内容。即使设置了Content-Disposition: inline,Internet Explorer也会下载音频文件。当我从Content-Type手动设置audio/mpegaudio/mpeg3 Chrome时,即使设置了Content-Disposition: inline,Chrome也会下载音频文件。

我不知道为什么有些浏览器会像他们一样表现,我错过了什么?

0 个答案:

没有答案