通过php流式传输文件

时间:2011-09-16 23:33:52

标签: php youtube

我有一个flv文件,我想通过php流式传输,atm我有以下代码:

更新代码
这是我从phihag复制的代码,但现在代码没有下载文件,它返回并清空文件!

$file = $_GET['url'];
if ((substr($file, 0, 7) != 'http://') && (substr($file, 0, 8) != 'https://')) {
die('You have to specify an HTTP URL');
}
$f = fopen($file, "rb"); // b is required on Windows
if ($f !== false) {
header('Content-Description: File Transfer');
header('Content-Type: application/flv');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
$f = fopen($_GET['file'], "r");
while(!feof($f)) {
echo fread($f,8192);
}
fclose($f);
exit;
}

上面的代码不起作用,由于某种原因,它没有传递if语句,当我删除if语句时,它下载一个空文件!请注意,该文件存储在我无法访问的远程服务器上。

由于

2 个答案:

答案 0 :(得分:4)

您的服务器可能是configured to disallow fopen() on URLs

此外,您有一个开放代理,这是一个安全风险。您应该验证所请求的URL,而不是通过服务器传递who-know-what。更糟糕的是,可以将本地文件传递到$_GET['file']并删除服务器上PHP运行的用户可访问的任何文件。可怕的东西!

答案 1 :(得分:2)

if (fopen($url, "r")) {使用未在此程序中定义的变量$url。你可能想要:

$file = $_GET['url'];
// Security check to prevent users from echoing all the files on this server
if ((substr($file, 0, 7) != 'http://') && (substr($file, 0, 8) != 'https://')) {
  die('You have to specify an HTTP URL');
}
$f = fopen($file, "rb"); // b is required on Windows
if ($f !== false) {
  header(...)
  echo ...
}