PHP

PHP-文件下载以及实时输出的问题

已解决

Posted by Kingtous on July 22, 2019

filesize()问题

Warning: filesize(): stat failed for ***

解决:将form表单中或其他渠道传值得到的文件路径用trim()处理

headers already sent by …问题

在html头部进行header的添加,如在头部加入

1
<?php include_once "xxx.php" ?> //xxx.php包含headers

开启实时输出的函数

  • 关闭apache2的output_buffering.
  • 关闭当前网站的gzip压缩.
    • 若函数无效,需要手动修改.htaccess文件,添加SetEnv no-gzip dont-vary解决.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function disable_ob() {
    // Turn off output buffering
    ini_set('output_buffering', 'Off');
    // Turn off PHP output compression
    ini_set('zlib.output_compression', false);
    // Implicitly flush the buffer(s)
    ini_set('implicit_flush', true);
    set_time_limit(0);
    ob_start();
    ob_end_flush();
    ob_implicit_flush(1);
    // Clear, and turn off output buffering
    while (ob_get_level() > 0) {
        // Get the curent level
        $level = ob_get_level();
        // End the buffering
        ob_end_clean();
        // If the current level has not changed, abort
        if (ob_get_level() == $level) break;
    }
    // Disable apache output buffering/compression
    if (function_exists('apache_setenv')) {
        apache_setenv('no-gzip', '1');
        apache_setenv('dont-vary', '1');
    }
}

文件下载模板

1
2
3
4
5
6
7
8
9
10
<?php

$file = trim($_REQUEST['file']);                                           //计算机上的一个文件
$fileName = basename($file);                                                                      //获取文件名
header("Content-Type:application/octet-stream");                                    //告诉浏览器文档类型(mime类型); octet-stream指的是二进制文件类型;下载任何类型的文件都可以这么指定
header("Content-Disposition:attachment;filename=".$fileName);        //告诉浏览器以附件方式对待文件(即下载文件);并设置下载后的文件名
header("Accept-ranges:bytes");                                                                   //告诉浏览器文件大小的单位
header("Accept-Length:".filesize($file));                                                    //告诉浏览器文件的大小
$h = fopen($file, 'r');                                                                                       //打开文件
echo fread($h, filesize($file));