php实现文件的强制下载

方文锋  2021-04-22 17:26:41  1323  首页学习PHP

最近公司项目遇到了文件下载的需求,比如pdf文件,图片文件,视频文件点击链接后直接下载下来,而不是浏览器默认打开这些文件。


 if(!function_exists('to_download')){
    /**
     * php强制文件下载
     * @param string $file 文件路径
     * @param string $rename 文件重命名
     */
    function to_download($file,$rename='')
    {
        //First, see if the file exists
        if (!is_file($file)) {
            die("<b>404 File not found!</b>");
        }

        //Gather relevent info about file
        $len = filesize($file);
        $filename = basename($file);
        //$file_extension = strtolower(substr(strrchr($filename, "."), 1));
        $file_extension = strtolower(end(explode('.', $filename)));

        //This will set the Content-Type to the appropriate setting for the file
        switch ($file_extension) {
            case "pdf":
                $ctype = "application/pdf";
                break;
            case "txt":
                $ctype = "application/txt";
                break;
            case "exe":
                $ctype = "application/octet-stream";
                break;
            case "zip":
                $ctype = "application/zip";
                break;
            case "doc":
                $ctype = "application/msword";
                break;
            case "xls":
                $ctype = "application/vnd.ms-excel";
                break;
            case "ppt":
                $ctype = "application/vnd.ms-powerpoint";
                break;
            case "gif":
                $ctype = "image/gif";
                break;
            case "png":
                $ctype = "image/png";
                break;
            case "jpeg":
            case "jpg":
                $ctype = "image/jpg";
                break;
            case "mp3":
                $ctype = "audio/mpeg";
                break;
            case "wav":
                $ctype = "audio/x-wav";
                break;
            case "mpeg":
            case "mpg":
            case "mpe":
                $ctype = "video/mpeg";
                break;
            case "mov":
                $ctype = "video/quicktime";
                break;
            case "avi":
                $ctype = "video/x-msvideo";
                break;

            //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
            case "php":
            case "htm":
            case "html":
            //case "txt":
                die("<b>Cannot be used for " . $file_extension . " files!</b>");
                break;
            default:
                $ctype = "application/force-download";
        }

        //Begin writing headers
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: public");
        header("Content-Description: File Transfer");

        //Use the switch-generated Content-Type
        header("Content-Type: $ctype");

        $rename && ($filename = $rename . '.' . $file_extension);
        //Force the download
        $header = "Content-Disposition: attachment; filename=" . $filename . ";";
        header($header);
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: " . $len);
        ob_clean();
        flush();
        @readfile($file);
        exit;
    }
}