php脚本直接从远程URL下载文件到用户的计算机

时间:2016-04-06 21:48:37

标签: php html

我希望网站用户能够轻松下载我们在远程托管服务上的文件(音频)。

我们有指向这些文件的网址。这些文件与主站点不在同一站点或服务器上。

目前我们有指向这些文件的链接,以及一些指示网站用户必须右键单击并选择“将文件另存为”的文本,以便将这些文件下载到本地计算机。

为了使这一点更加用户友好,如果站点用户只需单击一个链接并拥有一个可下载该文件的脚本,那就更好了。

这可能吗?

研究过这个问题之后,有很多关于在同一台服务器上下载文件或将URL下载到服务器的在线示例和SO问题。

这不是我们想要做的。我们不想将任何这些文件从远程托管服务复制到主Web服务器。

这是网站用户点击链接并让远程URL直接将文件下载到用户本地计算机而不是服务器。

2 个答案:

答案 0 :(得分: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,它会被强制下载给您的访问者点击它。

答案 1 :(得分:1)

您可能想要构建一个"代理页面"。您的服务器下载该文件, 同时 它将数据发送给您的最终用户。最简单的方法是在中输出文件:

a

Chunked $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-Encoding字段已知之前开始传输文件。有了这个,用户在开始下载之前不需要等待服务器完全下载文件。