Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何允许下载暂停/恢复?_Php_Http_Download - Fatal编程技术网

Php 如何允许下载暂停/恢复?

Php 如何允许下载暂停/恢复?,php,http,download,Php,Http,Download,通常,当我想允许用户下载文件而不透露确切位置时,我只是使用类似的方法让他们下载文件: header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment;

通常,当我想允许用户下载文件而不透露确切位置时,我只是使用类似的方法让他们下载文件:

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . $filename) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($filename));
readfile("$filename");
但是,如果他们使用的是现代浏览器或其他下载客户端,并且他们暂停下载并尝试恢复下载,脚本(假设他们仍然经过身份验证或其他什么)将从一开始就重新发送标题和文件内容,从而中断下载,基本上要求从一开始就重新下载文件


如何启用脚本来补偿暂停(以及随后恢复的)下载?

您需要读取请求头,如范围、If范围等,然后查找文件中的正确位置。通常,web服务器会在普通文件上为您执行此操作。这有点复杂,但这里有一些东西可以让你开始:


对于第二个链接,代码在第12部分中,使用php的内置fopen打开文件,然后fseek到正确的位置(基于请求头中的范围),然后使用fpassthru而不是readfile返回部分文件


您可以在

的注释下找到一些php示例代码,这些都是很好的链接。。。但我不理解这些示例中的代码。您知道任何以PHP为中心的教程或类似教程吗?谷歌目前并不是它通常乐于助人的自我……你真的需要这个功能吗?您的受保护下载是否来自用户上传?如果是,您对上传大小的限制是什么?如果是50MB或更少,我会说没有这个功能是可以的。或者,如果它们都是您生成的文件,并且平均大小同样小,则可能不需要这样做。另一方面,如果它们都是非常大的文件,你可以考虑像分发洪流那样做一些事情,然后保护下载文件。它并不像用户共享torrent文件那样安全——这只是一个值得思考的问题。从现在开始,我想问的是如何只寻求知识,而不是在任何特定的项目中使用它。在过去的项目中,我一直想要这个功能,将来可能也会。我只是想在我不急于找到答案的时候问一下。我还没有测试那段代码,但它正是我想要的,所以我接受这个答案。