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

时间:2012-07-05 03:31:18

标签: php readfile resume

我有这段代码:

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

1 个答案:

答案 0 :(得分:0)

修改你的卷曲以拉入身体(删除NOBODY选项)

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

在$ header上运行preg_match。

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


可恢复下载:如果文件很大,那么您可能希望在本地缓存它。 (即将“$ body”保存到本地文件,然后在本地文件上使用readfile。然后您可以通过打开文件(fopen)并前往正确的位置(fseek)和读取(fread)/来处理可恢复的下载从那里回复(回声)其余的。一旦你找到起点,fpassthru也应该这样做。

此外,如果您试图将其他人的内容作为您自己的内容传递,请先获取权限;)(否则,为什么不直接将用户引导到其他网址并自行保存带宽)