【问题标题】:Trouble downloading a file in browser using CURL使用 CURL 在浏览器中下载文件时遇到问题
【发布时间】:2019-09-13 03:52:30
【问题描述】:

我有一个要解决的问题。问题是使用 CURL 下载文件,并在发生这种情况时在浏览器中向用户提供另存为提示。我可以成功打开文件,但它直接在浏览器中作为字符数据打开。

到目前为止,我已经尝试使用标准的 Content-Type 和 Content-Disposition 标头,但实际上没有成功生成保存对话提示:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "ftp://server.com/recordings/4_23_2019/CD36FAFA9DFD4DE190B487C503D5A3D2 @ 2_04_28 PM.wav");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $file); #output
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
$file = curl_exec($ch);
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="CD36FAFA9DFD4DE190B487C503D5A3D2 @ 2_04_28 PM.wav"');
    header('Content-Transfer-Encoding: binary');
    header('Content-length: ' . filesize($file));
    readfile($file);
    exit;
}
?>

我相信使用这些标题应该会向用户提供保存提示,但我会得到一个包含一堆随机字符的页面。

产生的错误:

警告:file_exists() 期望参数 1 是资源,字符串 在 /path/name 中给出

警告:无法修改标头信息 - 标头已发送

【问题讨论】:

  • 谢谢,删除问题的通配符部分。
  • 你可能需要小心你的 PHP 标签。例如,如果您在一行中单独包含“”,直到您的 PHP 文件的顶部,服务器可能会在发送标头之前发送一个换行符,这通常会破坏标头。如果可以,请在第一个 PHP 标记内尝试,在换行符有机会呈现之前。
  • 那个浏览器会属于 IE 家族吗?
  • 谢谢,@UncaAlby 我所看到的标题没有问题,没有 php 输出错误,我已经更新了代码以显示 php 标签的位置。

标签: php curl


【解决方案1】:

这是来自一个项目的工作代码(不在产品中)。

if (file_exists($path)) {
    if (is_readable($path)) {
        @set_time_limit(900);
        $NomFichier = basename($path);
        header("Content-Type: application/force-download; name=\"$NomFichier\"");
        header("Content-Transfer-Encoding: binary");
        header("Content-Disposition: attachment; filename=\"$NomFichier\"");
        header("Expires: 0");
        header("Cache-Control: no-cache, must-revalidate");
        header("Pragma: no-cache");
        readfile($path);

      exit;
    } else {
        $this->say_error("Access denied for this file.");
    }
} else {
    $this->say_error("File moved or deleted.");
}

【讨论】:

  • 如果文件将存在于 OP 的服务器上,则无需通过 curl 测试文件是否存在,对吗?因此,使用$mypath 似乎很难解决这个问题
  • curl 用于从远程服务器加载文件并填充本地(模板)文件。在这种情况下,$mypath 是用于保存内容和读取供用户下载的模板文件。如果先生。 PA 编写完整的规范。关于他的任务,我们可以找到最优解。我没有更正他的代码。
  • 查看 OP 的最后一个 comment
  • 哦,是的,我错过了很多问题,我将用一个项目中的一段工作代码替换答案,也许它会对作者有所帮助。谢谢你纠正我。
  • 请在您的代码中添加一些解释。为什么你认为它解决了 OPs 问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多