<?php
/**
 * lvzheAdmin
 * @author xiekunyu <raingad@foxmail.com>
 * @license http://www.apache.org/licenses/LICENSE-2.0
 */
namespace utils;

//------------------------
// 文件下载和图片下载
//-------------------------

class File
{
    /**
     * 文件下载
     * @param $file_path
     * @param string $file_name
     * @param string $file_size
     * @param string $ext
     */
    public static function download($file_path, $file_name = '', $file_size = '', $ext = '')
    {
        if (!$file_name) {
            $file_name = basename($file_path);
        }
        if (!$file_size && in_array(substr($file_path, 0, 1), [".", "/"])) {
            try {
                $file_size = filesize($file_path);
            } catch (\Exception $e) {
                return "文件不存在";
            }
        }
        if (!$ext) {
            $ext = pathinfo($file_path, PATHINFO_EXTENSION);
        }
        if ($ext && !strpos($file_name, ".")) {
            $file_name = $file_name . "." . $ext;
        }
        $content_type = self::getMime($ext);
        header("Cache-Control:");
        header("Cache-Control: public");
        // 处理中文文件名
        $ua = $_SERVER["HTTP_USER_AGENT"];
        $encoded_filename = rawurlencode($file_name);
        
        // 文件类型
        if (preg_match("/Safari/", $ua)) {
            header('Content-Type: application/octet-stream;charset=utf-8');
        } else {
            header("Content-type: {$content_type}");
        }
        //IE
        if (preg_match("/MSIE/", $ua) || preg_match("/Trident\/7.0/", $ua)) {
            header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
        } else if (preg_match("/Firefox/", $ua)) {
            header('Content-Disposition: attachment; filename*="utf8\'\'' . $file_name . '"');
        } else if (preg_match("/Safari/", $ua)) {
            header('Content-Disposition: attachment; filename*=UTF-8\'\'' . $encoded_filename);
        } else {
            header('Content-Disposition: attachment; filename="' . $file_name . '"');
        }
        // 文件大小
        if ($file_size) {
            header("Accept-Length: " . $file_size);
            header("Content-Length: " . $file_size);
        }
        readfile($file_path);exit();
    }

    /**
     * 功能：php多种方式完美实现下载远程图片保存到本地
     * 参数：文件url,保存文件名称，使用的下载方式
     * 当保存文件名称为空时则使用远程文件原来的名称
     * @param string $url      请求图片的链接
     * @param string $filename 保存的文件名
     * @param int $type        保存图片的类型 0为curl,适用于静态图片,其他为缓冲缓存,适用于动态图片
     * @return string $filename 返回保存的文件名
     */
    public static function downloadImage($url, $filename, $type = 0)
    {
        if ($url == '') {
            return false;
        }
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'tif', 'tiff'])) {
            $ext = pathinfo($url, PATHINFO_EXTENSION);
            if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'tif', 'tiff'])) {
                $ext = 'jpg';
            }
            $filename = $filename . "." . $ext;
        }

        //下载文件流
        if ($type) {
            $ch = curl_init();
            $timeout = 5;
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            $img = curl_exec($ch);
            curl_close($ch);
        } else {
            ob_start();
            readfile($url);
            $img = ob_get_contents();
            ob_end_clean();
        }

        //保存文件
        //        try {
        $fp2 = fopen($filename, 'w');
        fwrite($fp2, $img);
        fclose($fp2);
        return $filename;
        /*} catch (\think\Exception $e) {
    //TODO 异常处理
    return false;
    }*/
    }

    /**
     * 获取文件Mime
     * @param string $ext
     * @return string
     */
    public static function getMime($ext)
    {
        $mimes = [
            'xml' => 'text/xml',
            'json' => 'application/json',
            'js' => 'text/javascript',
            'php' => 'application/octet-stream',
            'css' => 'text/css',
            'html' => 'text/html',
            'htm' => 'text/html',
            'xhtml' => 'text/html',
            'rss' => 'application/rss+xml',
            'yaml' => 'application/x-yaml',
            'atom' => 'application/atom+xml',
            'pdf' => 'application/pdf',
            'text' => 'text/plain',
            'png' => 'image/png',
            'jpg' => 'image/jpeg',
            'gif' => 'image/gif',
            'csv' => 'text/csv',
            'tif' => 'image/tiff',
            'ai' => 'application/postscript',
            'asp' => 'text/asp',
            'au' => 'audio/basic',
            'avi' => 'video/avi',
            'rmvb' => 'application/vnd.rn-realmedia-vbr',
            '3gp' => 'application/octet-stream',
            'flv' => 'application/octet-stream',
            'mp3' => 'audio/mpeg',
            'wav' => 'audio/wav',
            'sql' => 'application/octet-stream',
            'rar' => 'application/octet-stream',
            'zip' => 'application/zip',
            '7z' => 'application/octet-stream',
            'bmp' => 'application/x-bmp',
            'cdr' => 'application/x-cdr',
            'class' => 'java/*',
            'exe' => 'application/x-msdownload',
            'fax' => 'image/fax',
            'icb' => 'application/x-icb',
            'ico' => 'image/x-icon',
            'java' => 'java/*',
            'jfif' => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'jsp' => 'text/html',
            'mp4' => 'video/mpeg4',
            'mpa' => 'video/x-mpg',
            'mpeg' => 'video/mpg',
            'mpg' => 'video/mpg',
            'mpga' => 'audio/rn-mpeg',
            'ras' => 'application/x-ras',
            'tiff' => 'image/tiff',
            'txt' => 'text/plain',
            'wax' => 'audio/x-ms-wax',
            'wm' => 'video/x-ms-wm',
            'apk' => 'application/vnd.android.package-archive',
            'doc' => 'application/msword',
            'dot' => 'application/msword',
            'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
            'docm' => 'application/vnd.ms-word.document.macroEnabled.12',
            'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
            'xls' => 'application/vnd.ms-excel',
            'xlt' => 'application/vnd.ms-excel',
            'xla' => 'application/vnd.ms-excel',
            'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
            'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
            'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
            'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
            'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
            'ppt' => 'application/vnd.ms-powerpoint',
            'pot' => 'application/vnd.ms-powerpoint',
            'pps' => 'application/vnd.ms-powerpoint',
            'ppa' => 'application/vnd.ms-powerpoint',
            'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
            'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
            'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
            'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
            'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
            'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
            'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
        ];
        return isset($mimes[$ext]) ? $mimes[$ext] : 'application/octet-stream';
    }

/**
 * 下载文件到服务器
 * addtime 2020年8月28日 18:38:43
 */
    public static function getFile($url, $save_dir = '', $filename = '', $type = 0)
    {
        if (trim($url) == '') {
            return false;
        }
        if (trim($save_dir) == '') {
            $save_dir = './';
        }
        if (0 !== strrpos($save_dir, '/')) {
            $save_dir .= '/';
        }
        //创建保存目录
        if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) {
            return false;
        }
        //获取远程文件所采用的方法
        if ($type) {
            $ch = curl_init();
            $timeout = 5;
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            $content = curl_exec($ch);
            curl_close($ch);
        } else {
            ob_start();
            readfile($url);
            $content = ob_get_contents();
            ob_end_clean();
        }
        $size = strlen($content);
        //文件大小
        $fp2 = @fopen($save_dir . $filename, 'a');
        fwrite($fp2, $content);
        fclose($fp2);
        unset($content, $url);
        $res['code'] = 200;
        $res['file_name'] = $filename;
        return $res;
    }
    /**
     * 检测文件大小
     */
    public static function getFileSize($url)
    {
        $res = get_headers($url, true);
        $filesize = round($res['Content-Length'] / 1024 / 1024, 2); //四舍五入获取文件大小，单位M
        return $filesize;
    }

}
