2011-09-16 15 views
0

以上のファイル:、これは私がphihagからコピーしたコードであるストリーム私はFLVファイルを持っている、と私はPHPの上にストリーミングしたい、ATM、私は次のコードを持っているPHP

更新されたコード
をしかし、今コードはファイルをダウンロードしません、それは空のファイルを返します!

$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;
}

doesntの仕事上のコードでは、何らかの理由では、if文を渡されるdoesntの、そして私はifstatementを削除するときには、空のファイルをダウンロードします!!!ファイルは私がアクセスできないリモートサーバに保存されていることに注意してください。

おかげ

答えて

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 ... 
} 
+0

ありがとう、しかし今、そのファイルをダウンロードしていない、その空のファイルを返す〜! – ahoura

+1

@ahoura 'fopen'はコード全体の抜粋の中で一度だけ呼び出され、後者は削除されます。また、最初にファイルをダウンロードできることを確認してください。 – phihag

+0

ねえ、私は手動でやったのでファイルをダウンロードできると確信していますが、あなたが意味することは理解できません。 – ahoura

4

サーバーにはおそらくconfigured to disallow fopen() on URLsです。

また、オープンプロキシがあり、セキュリティ上のリスクがあります。誰かがあなたのサーバーを介して渡すのではなく、要求されたURLを検証する必要があります。さらに悪いことに、ローカルファイルを$_GET['file']に渡し、PHPが実行するユーザがアクセスできるサーバ上のファイルをすべて破棄することが可能です。恐ろしいもの!

関連する問題