无法使用CURL在浏览器中下载文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用CURL在浏览器中下载文件相关的知识,希望对你有一定的参考价值。

我有一个问题,我想解决。问题是使用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中给出的字符串

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

答案

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

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.");
}

以上是关于无法使用CURL在浏览器中下载文件的主要内容,如果未能解决你的问题,请参考以下文章

无法在 R 中下载文件 - 状态 503

如何使用 webview 组件在 App 中下载文件?

如何在GitHub正确地使用 Curl 下载文件?

使用 Selenium 在 IE 中下载文件

从我的 ASP.NET 站点在 Android 3.0 浏览器中下载文件

如何在CMD命令中下载文件