使用PHP的readfile()实现可恢复下载外部链接文件

3

我有这段代码:

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位于不同的服务器。如何启用此下载的续传呢?谢谢!


阅读有关范围的内容(您需要它来请求远程文件和发送您的内容)。 - zerkms
但它能在readfile()中正常工作吗? - Dor Aharonson
不行,你需要手动执行请求(使用curl,只要你无论如何都在使用它)。 - zerkms
我还需要帮助。我没有完全理解如何做。 - Dor Aharonson
首先,使用curl重写您的解决方案,而不是使用readfile()。完成后,请返回并修改您的问题。 - zerkms
1个回答

0

修改您的curl,以便还可以获取正文内容(删除NOBODY选项)

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

在$header上运行preg_match。

要输出其余部分,只需“echo $body”,或者对于可恢复下载,使用substr($body,$startpos)。


可恢复下载:如果文件很大,您可能希望在本地缓存它。 (即将“$body”保存到本地文件中,然后在本地文件上使用readfile。然后,您可以通过打开文件(fopen)并转到正确的位置(fseek)以及从那里读取(fread)/回显(echo)其余部分来处理可恢复下载。一旦找到起始点,fpassthru也应该执行相同的操作。

此外,如果您试图将他人的内容冒充为自己的,请先获得许可;)(否则,为什么不直接将用户引导到其他URL并节省进出带宽)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接