<?php


namespace app\api\controller;
//define('BASE_PATH', getcwd());

use app\common\controller\Api;
use app\lib\FileUpload;
use fast\Random;
use think\Config;
use think\Log;

class Upload extends Api
{

    protected $noNeedLogin = [];
    protected $noNeedRight = ['*'];


    /**
     * 上传水印文件
     */
    public function upload()
    {
        Config::set('default_return_type', 'json');
        $file = $this->request->file('file');
//        $water = $this->request->post('water',0);;//是否水印 0否，1是
        if (empty($file)) {
            $this->error(__('No file upload or server upload limit exceeded'));
        }
        //判断是否已经存在附件
        $sha1 = $file->hash();
        $extparam = $this->request->post();
        unset($extparam['name']);
        $upload = Config::get('upload');
        $multipart=$upload['multiparameter'];
        $url='';
        if($extparam){
            foreach ($extparam as $key=>$val){
                if(is_numeric($key)){
                    $multipart =$multipart.$val;
                    $url = $url.$val;
                }
            }
//            $multipart =$multipart."/";
            $url=$upload['cdnurl'].$url;
        }
        preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches);
        $type = strtolower($matches[2]);

        $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
        $size = (int)$upload['maxsize'] * pow(1024, isset($typeDict[$type]) ? $typeDict[$type] : 0);
        $fileInfo = $file->getInfo();
        $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
        $suffix = $suffix && preg_match("/^[a-zA-Z0-9]+$/", $suffix) ? $suffix : 'file';

        $mimetypeArr = explode(',', strtolower($upload['mimetype']));
        $typeArr = explode('/', $fileInfo['type']);

        //禁止上传PHP和HTML文件
        if (in_array($fileInfo['type'], ['text/x-php', 'text/html']) || in_array($suffix, ['php', 'html', 'htm'])) {
            $this->error(__('Uploaded file format is limited'));
        }
        //验证文件后缀
        if ($upload['mimetype'] !== '*' &&(!in_array($suffix, $mimetypeArr)
                || (stripos($typeArr[0] . '/', $upload['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr))))) {
            $this->error(__('Uploaded file format is limited'));
        }
        //判断图片是否过大
        if($fileInfo['size']>$size){
            $this->error("上传文件过大！");
        }
        //验证是否为图片文件或视频文件
        $imagewidth = $imageheight = 0;
        if (in_array($fileInfo['type'], ['image/gif', 'image/jpg', 'image/jpeg', 'image/bmp', 'image/png', 'image/webp']) || in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'webp', 'swf', 'mp4', 'mp3', 'avi', ',flv', 'wmv', 'wav'])) {
            $imgInfo = getimagesize($fileInfo['tmp_name']);
            if (!$imgInfo || !isset($imgInfo[0]) || !isset($imgInfo[1])) {
                $this->error(__('Uploaded file is not a valid image'));
            }
            $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
            $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
        }
        $replaceArr = [
            '{year}' => date("Y"),
            '{mon}' => date("m"),
            '{day}' => date("d"),
            '{hour}' => date("H"),
            '{min}' => date("i"),
            '{sec}' => date("s"),
            '{random}' => Random::alnum(16),
            '{random32}' => Random::alnum(32),
            '{filename}' => $suffix ? substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')) : $fileInfo['name'],
            '{suffix}' => $suffix,
            '{.suffix}' => $suffix ? '.' . $suffix : '',
            '{filemd5}' => substr(md5($fileInfo['tmp_name'].time()),-18),
        ];
        $savekey = $upload['savekey'];
        $savekey = str_replace(array_keys($replaceArr), array_values($replaceArr), $savekey);
        $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
        $fileName = substr($savekey, strripos($savekey, '/') + 1);
        $res = FileUpload::image($multipart.$uploadDir.$fileName, $fileInfo['tmp_name']);
        Log::record("上传是否成功".$res, 'debug');//记录错误
        if($res){
            $this->success('上传成功',[
                'url' =>$multipart.$uploadDir.$fileName,
                'cdnurl'=>$upload['cdnurl'],
            ]);
        }else{
            // 上传失败获取错误信息
            $this->error($file->getError());
        }
    }
}