【发布时间】:2013-07-26 09:03:40
【问题描述】:
我在 php.net 中找到了这个脚本,它允许用户下载本地文件。每当我尝试在文件名前面使用协议时,PHP 都找不到该文件。我在 php.net 中启用了 allow_url_fopen。我应该怎么做才能允许下载远程文件?
此外,即使有下载管理器的帮助,下载也确实很慢。有什么办法可以提高下载速度吗?有没有办法允许下载管理器中的“恢复下载”选项?
<?php
$file = 'https://www.example.com/test.exe';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
} else echo "file not found."
?>
【问题讨论】:
-
如果文件下载缓慢,请尝试增加服务器或下载用户可用的带宽。运行这个脚本总是会比用户直接下载文件慢
-
你没有在附件头中添加协议没有必要
-
@Anigel:对不起,我不同意。中间人下载可以更快。
-
@DaveChen 在没有奇怪的防火墙规则或非常奇怪的代理配置的情况下,我从未经历过。即使服务器 B 的带宽比服务器 A 多,文件也只能通过服务器 B 到达用户,速度与服务器 A 发送给用户的速度一样快。
-
file_exists()调用会很昂贵,并且会减慢传输的启动速度(您正在向远程服务器发出 2 个请求),但如果传输本身很慢,那么问题只是带宽。您需要对请求进行更精细的控制,cURL 可以为您提供,您需要使用CURLOPT_PROGRESSFUNCTION回调来控制远程服务器的响应是否转发到客户端。或者,您可能想查看一个合适的 HTTP 客户端库,但这需要对 HTTP 协议有更广泛的了解。
标签: php url download protocols wrapper