【问题标题】:Tell to browser to start download as cURL receives first chunk of file?当 cURL 接收到第一块文件时告诉浏览器开始下载?
【发布时间】:2015-06-01 14:25:37
【问题描述】:

我想使用 cURL 将远程文件下载到浏览器,文件超过 400 MB。在下面的代码中,cURL 等待将所有文件下载(太长)到内存,然后浏览器才会询问在哪里找到它并开始下载它。

如何修复代码以便 cURL 接收到第一个块,它告诉浏览器立即开始下载而不等待它全部下载到 php 的内存中呢?

代码:

<?php

header("Content-Disposition: attachment; filename=\"How to Use Git and GitHub Videos.zip\"");
header("Content-type: application/octet-stream");
header("Content-Transfer-Encoding: binary");

$url = "http://zips.udacity-data.com/ud775/How%20to%20Use%20Git%20and%20GitHub%20Videos.zip";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $buffer) {
  echo $buffer;
  return strlen($buffer);
});

curl_exec ($ch);
curl_close($ch);

?>

【问题讨论】:

  • 试试flush() 来强制输出连接线?
  • @MarcB,我在echo $buffer 之后插入了它,但我们仍在等待,没有任何回应。你能推荐点什么吗?
  • 最有可能发生的是脚本的输出被 Web 服务器缓冲。 flush() 可能会或可能不会强制它传输缓冲的数据,但这取决于服务器类型、配置、它使用的模块等。如果不考虑这些,您的问题就无法解决。
  • @lafor 可以建议做什么?

标签: php curl download downloading-website-files


【解决方案1】:

您可以消除问题(甚至不使用 curl): 将重定向写入实际文件,而不是自己下载然后发送。您将节省带宽、内存和时间。

<?php
$url = "http://zips.udacity-data.com/ud775/How%20to%20Use%20Git%20and%20GitHub%20Videos.zip";

header("Location: $url");
?>

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 2015-06-29
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多