php 下载文件的header

2020-06-28

下载文件

/**
 * @description: 可用于ajax返回,也可直接下载
 * @param {*} $file 文件地址
 * @param {*} $name 下载的文件名
 * @return {*}
 */    
function ajax_return($file,$name = '')
{
    $file_name = $name ?: pathinfo($file.PATHINFO_BASENAME);
    $file_name = str_replace("+", "%20", urlencode($file_name));

    // 可以指定文件类型下载文件
    // $finfo = finfo_open(FILEINFO_MIME_TYPE);
    // $mime = finfo_file($finfo, $file);

    ob_end_clean();
    header('Pragma:public');
    header('Content-Type:application/octet-stream');
    // header('Content-Type:'.$mime);
    header('Content-Disposition:attachment; filename="'.$file_name.'"');
    header('Content-Length:'.filesize($file));
    header('Content-Transfer-Encoding:binary');

    echo file_get_contents($file);
    unlink($file);
}

输出文件

/**
 * @description: 将文件直接展示在浏览器中
 * @param {*} $file 文件地址
 * @return {*}
 */    
function show_brower($file)
{
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $file);

    ob_end_clean();
    header('Pragma:public');
    header('Content-Type:'.$mime);
    header('Content-Disposition:inline;');
    header('Content-Length:'.filesize($file));
    header('Content-Transfer-Encoding:binary');
    header('Expires:'.gmdate("D, d M Y H:i:s", time() + 7 * 86400 . ' GMT'));

    echo file_get_contents($file);
}

下载pdf

/**
 * @description: 下载pdf
 * @param {*} $file 文件地址
 * @param {*} $name 下载的文件名
 * @return {*}
 */    
function down_pdf($file,$name = '')
{
    $file_name = $name ?: pathinfo($file.PATHINFO_BASENAME);
    $file_name = str_replace("+", "%20", urlencode($file_name));

    ob_clean();
    header("Content-type: application/pdf");
    header("Content-Disposition:attachment;filename=".$file_name);
    header('Cache-Control: max-age=0');
    readfile($file);
    unlink($file); 
}

下载中文名乱码问题

将中文名urlencode

$new_name = str_replace("+", "%20", urlencode($file_name));

下载大文件时文件损坏解决方法

遇到的问题:下载200M的文件时,下载的文件只有几kb,还不报错

原因:PHP内存有限制,需要改为按块下载,就是把大文件切块后逐块下载。

/**
 * @description: 下载大文件
 * @param {*} $file 文件地址
 * @param {*} $name 下载的文件名
 * @return {*}
 */    
function down_big_file($file,$name)
{
    //总的缓冲的字节数
    $sum_buffer=0;
    //针对大文件,规定每次读取文件的4096字节
    $read_buffer = 4096;
    $filesize = filesize($file);
    $file_name = $name ?: pathinfo($file.PATHINFO_BASENAME);
    $file_name = str_replace("+", "%20", urlencode($file_name));

    header('Pragma: public');
    header('Content-Type: application/octet-stream');
    header('Content-Description: File Transfer');
    header('Content-Disposition: attachment; filename='.$file_name);
    header('Content-Transfer-Encoding: chunked'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Content-Length:'.$filesize);
    header('Expires: 0');

    $handle = fopen($file, 'rb');

    while(!feof($handle) && $sum_buffer < $filesize) { //文件未读取完时一直读取   
        echo fread($handle,$read_buffer);
        $sum_buffer+=$read_buffer;
    }
    fclose($handle);
    unlink($file); 
    exit();
}

 

{/if}