2016-04-06 18 views
-1

サイトのユーザーがリモートホスティングサービス上にあるファイル(オーディオ)を簡単にダウンロードできるようにしたいと考えています。リモートURLからユーザーのコンピュータにファイルを直接ダウンロードするためのPHPスクリプト

これらのファイルを指すURLがあります。ファイルは、メインサイトと同じサイトまたはサーバー上に保持されません。

現在のところ、これらのファイルを指すリンクと、ローカルユーザーにこれらのファイルをローカルマシンにダウンロードさせるために、「ファイルを別名で保存」を選択してサイトユーザーに指示するテキストがあります。

これをよりユーザーフレンドリーにするには、サイトユーザーが単にリンクをクリックしてファイルをダウンロードするスクリプトを用意すれば、はるかに良いでしょう。

これは可能ですか?

これを調べたところ、同じサーバー上でファイルをダウンロードしたり、サーバーにURLをダウンロードしたりするというオンラインの例が多くあります。

これは私たちがここでやりたいことではありません。これらのファイルのいずれかをリモートホスティングサービスからメインWebサーバーにコピーする必要はありません。

これは、サイトユーザーがリンクをクリックし、リモートURLがサーバーではなくユーザーのローカルマシンにファイルを直接ダウンロードさせるためのものです。

+0

既存のリンクを左クリックするとどうなりますか? –

+0

ユーザーがリモートURL上のリンクをクリックすると、ホスティングサービスはダウンロードを開始するための適切なヘッダーを送信するだけです。 – Federkun

+0

私たちはリモートホスティングサーバーを支配しておらず、メインのWebサイトのみを管理しています。ファイルを左クリックした場合、ユーザーのブラウザで再生しようとします。これは私達が起こる必要があるものではありません。これらのリンクは、ファイルを再生するのではなく、ユーザーがファイルを自分のマシンにダウンロードするためのリンクを「ダウンロード」する必要があります。 – Richard

答えて

2

は、次のPHPを使用してこれを実現できます。

$file_name = $_GET['filename']; 
$file_url = 'http://path_to_audio_folder.com/' . $file_name; 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url); 
exit; 

それからなどのスクリプトからそれを呼び出すことができます。download.php?filename=my_song.mp3、それはそれをクリックするあなたの訪問者へのダウンロードとして強制されるだろう。

+0

これは素敵でシンプルなソリューションであり、うまく機能します。ありがとうございました! – Richard

+0

ファイルの名前を変更できますか? – Nerazzurri

+0

@VermaJr。明確にすることはできますか?あなたが 'filename = my_song.mp3'を意味するならば、あなたのディレクトリに存在し、公開されていれば、それはどんなMP3ファイル名でもかまいません。 – Ryan

1

"プロキシページ"を作成することができます。あなたのサーバはファイルをダウンロードし、の間にをダウンロードしてエンドユーザに送信します。そうするための最も簡単な方法は、出力にあるチャンクでファイル

$url = 'http://.....mp3'; 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($url)); 
header('Content-Transfer-Encoding: chunked'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 

$stream = fopen('php://output', 'w'); 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_READFUNCTION, function($ch, $fd, $length) use ($stream) { 
    return fwrite($stream, fread($fd, $length)); 
}); 

curl_exec($ch); 
curl_close($ch); 

チャンクContent-Transfer-EncodingContent-Lengthフィールドが知られる前に、クライアントがファイルの送信を開始することができます。これにより、ダウンロードを開始する前に、ファイルを完全にダウンロードするためにサーバーを待つ必要はありません。

+0

お手数ですが ファイルをダウンロードしてユーザーに送信し、ダウンロードしたストリームをサーバーから削除する必要があります。私は私のサーバーディレクトリ内のファイルスペースが限られているので –

関連する問題