3

我正在尝试实现 PHP 强制下载并使用下面的代码

$length = sprintf("%u", filesize($path));
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($path).'"');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $length);
set_time_limit(0);
readfile($path);
exit;

该文件以完整大小成功下载(我在记事本++中打开文件并且没有php错误或警告),但我无法打开文件。奇怪的是我可以毫无问题地下载和打开 pdf 文件。但是 docx、png、jpg 等格式的文件是受欢迎的

4

6 回答 6

0

我认为您应该使用正确的内容类型

以下是内容类型列表: http ://www.freeformatter.com/mime-types-list.html

于 2013-11-22T13:46:31.250 回答
0

尝试暂时删除您的内容长度标头,这可能是错误的并导致文件下载不完整(可能是单个字节)。还可以尝试将到期时间设置为高于 0;我在 IE 中看到了由此引起的错误,因为浏览器在外部程序有时间加载文件之前就从缓存中删除了文件。

于 2013-11-22T13:30:58.817 回答
0

用它来强制下载

header("Cache-Control:  maxage=1");
header("Pragma: public");
header("Content-type: application/force-download");
header("Content-Transfer-Encoding: Binary");
header("Content-length: ".filesize($path));
header("Content-disposition: attachment; filename=\"".basename($path)."\"");
于 2013-11-22T13:32:00.780 回答
0

试试这个代码

$file = "xyz.html"
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
readfile($file);
于 2013-11-22T13:50:05.910 回答
0
    $file=FCPATH."downloaded/1462026746_IMG_2015.JPG"; //file location 
        if(file_exists($file)) {

        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
        }
        else {
            die('The provided file path is not valid.');
        }
于 2016-05-01T03:24:26.103 回答
0

ob_get_clean();在标题之前和 ob_clean(); flush();之前添加readfile();

我有同样的问题,这为我解决了。

于 2018-03-13T07:00:56.037 回答