2011-10-30 7 views
1

私は長い間SOを使ってきましたが、最終的には答えが見つからない質問がありました。私は自分のサイトを使用して、別のサーバーでホストされているファイルにユーザーをリダイレクトする必要があります。サーバで帯域幅を使用せずに外部ファイルをダウンロードするにはどうすればよいですか?

header("Location: $url") 

はしかし、他のサーバにホストされているファイルは、ファイル名だけとしてUUIDを持っているので、私は適切なMIMEタイプとファイル名を渡すためにヘッダーを使用します(これは:最初に私は、「これは簡単なはず」と思いました私が知るだろう)。これは私が次のコードを使用して行うことができます。

<?php 
$filename = $_REQUEST["name"]; 
$filesize = $_REQUEST["size"]; 
$mimetype = $_REQUEST["mime"]; 
$url = $_REQUEST["url"]; 

// used to test 
$filename = "example.txt"; 
$filesize = "2966"; 
$mimetype = "text/plain"; 
$url = "http://example.com"; 

header('Content-Type: ' . $mimetype); 
header("Content-length: " . ($filesize + 0)); 
header('Content-Disposition: attachment; filename="' . $filename . '"'); 

// this just redirects to the page, ignoring the Content- headers 
//header('Location: ' . $url); 

// this works, but I suspect that it uses my server's bandwidth 
readfile($url); 
exit(); 

?> 

を私は上記の投稿した方法は、実際にダウンロードをユーザに提示んが、それは私自身のサーバーを介してダウンロードを通りませんか?私は潜在的にこれで多くのファイルをダウンロードしている可能性があり、私はむしろ自分の帯域幅を使用しないでください。私はこれが可能ではないかもしれないことを認識していますが、私はどんな洞察にも感謝します。

+0

サーバーからヘッダーを設定する場合、コンテンツが同じ方法で配信されるため、帯域幅を使用する必要があります。 –

+2

これはまさにあなたが疑っているとおりです。 'readfile()'コールはあなたの側で帯域幅を消費し、リダイレクトで外部リソースにHTTPリーダーを当てることは不可能です。これを行う外部サービスが見つからない限り(そして帯域幅を提供する)、ここでは回避策はありません。 – mario

+0

* sigh *私は思ったほどです。みんなありがとう。 – MalcolmOcean

答えて

0

短い答えは、これはできません。ブラウザはファイルを配信しているサーバーのヘッダーのみを調べます。

サーバーを介して要求をプロキシする(帯域幅を2倍にすることなく)か、サイトの所有者と話をする必要があります。

+0

ありがとうございます。幸いにも、私はサイトの所有者に接続しているので、実際にここで何かを行うことができます。 – MalcolmOcean

0
$file=fopen('http://example.com/example.txt','r'); 
header("Content-Type:text/plain"); 
header("Content-Disposition: attachment; filename="example.txt"); 
fpassthru($file); 

MP4ファイルのダウンロード用に動作します。

関連する問題