我希望网站用户能够轻松下载我们在远程托管服务上的文件(音频)。
我们有指向这些文件的网址。这些文件与主站点不在同一站点或服务器上。
目前我们有指向这些文件的链接,以及一些指示网站用户必须右键单击并选择“将文件另存为”的文本,以便将这些文件下载到本地计算机。
为了使这一点更加用户友好,如果站点用户只需单击一个链接并拥有一个可下载该文件的脚本,那就更好了。
这可能吗?
研究过这个问题之后,有很多关于在同一台服务器上下载文件或将URL下载到服务器的在线示例和SO问题。
这不是我们想要做的。我们不想将任何这些文件从远程托管服务复制到主Web服务器。
这是网站用户点击链接并让远程URL直接将文件下载到用户本地计算机而不是服务器。
答案 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
字段已知之前开始传输文件。有了这个,用户在开始下载之前不需要等待服务器完全下载文件。