我想用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/mpeg
到audio/mpeg3
Chrome时,即使设置了Content-Disposition: inline
,Chrome也会下载音频文件。
我不知道为什么有些浏览器会像他们一样表现,我错过了什么?