使用外部链接 PHP 的 readfile() 进行可恢复下载


Make resumable downloads with readfile() of external link PHP

我有这个代码:

if  (isset($_GET['file']) && isset($_GET['name']))
{
    $ch = curl_init($file);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    $data = curl_exec($ch);
    curl_close($ch);
    if (preg_match('/Content-Length: ('d+)/', $data, $matches)) 
    {
        // Contains file size in bytes
        $contentLength = (int)$matches[1];
    }
    header("Content-type: application/x-file-to-save");
    header("Content-Disposition: attachment; filename=".$_REQUEST['name']);
    header('Content-Length: ' . $contentLength);
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    header('Connection: Keep-Alive');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0', false);
    header('Cache-Control: private', false);
    readfile($file);
}

问题是$file位于不同的服务器上。如何启用恢复此下载?谢谢!

修改你的卷发,也拉入身体(删除 NONE 选项)

然后,您可以将返回的内容 ($data) 拆分为标题和正文 - 拆分是第一个空行(在一行中查找两个回车符 - 上面的内容是标题,下面的任何内容都是正文)。将它们放入变量$header和$body中。

在$header上运行preg_match。

要输出其余部分,只需"echo $body"或 substr($body, $startpos) 即可进行可恢复下载。


可断点续传下载:如果文件很大,则可能需要在本地缓存它。(即将"$body"保存到本地文件,然后在本地文件上使用 readfile。然后,您可以通过打开文件(fopen)并转到正确的位置(fseek)并从那里读取(fread)/回显(echo)其余部分来处理可恢复下载。一旦你找到了起点,fpassthru也应该做同样的事情。

此外,如果您试图将他人的内容伪装成自己的内容,请先获得许可;) (否则为什么不简单地将用户定向到另一个 URL 并节省进出带宽)