php脚本从远程URL下载文件到用户';的电脑


php script to download files from a remote URL to the user's computer directly

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

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

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

为了让这对用户更友好,如果网站用户只需点击一个链接,并有一个可以下载文件的脚本,那会更好。

这可能吗?

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

这不是我们想在这里做的。我们不想将这些文件中的任何一个从远程托管服务复制到主web服务器。

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

您可以通过使用以下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,它将被强制下载给点击它的访问者。

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

$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允许客户端在Content-Length字段已知之前开始传输文件。有了这一点,用户不需要等待服务器完全下载文件,然后再开始下载。