审查视图

application/api/controller/Common.php 8.0 KB
王智 authored
1 2 3 4 5 6 7
<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\model\Area;
use app\common\model\Version;
1  
王智 authored
8
use EasyWeChat\Foundation\Application;
王智 authored
9
use Qiniu\Auth;
王智 authored
10 11
use think\Config;
use think\Hook;
王智 authored
12
use app\common\model\Attachment;
王智 authored
13 14 15 16 17 18

/**
 * 公共接口
 */
class Common extends Api
{
王智 authored
19
    protected $noNeedLogin = ['*'];
王智 authored
20 21 22 23 24 25
    protected $noNeedRight = '*';

    /**
     * 加载初始化
     *
     * @param string $version 版本号
王智 authored
26 27
     * @param string $lng 经度
     * @param string $lat 纬度
王智 authored
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
     */
    public function init()
    {
        if ($version = $this->request->request('version')) {
            $lng = $this->request->request('lng');
            $lat = $this->request->request('lat');

            //配置信息
            $upload = Config::get('upload');
            //如果非服务端中转模式需要修改为中转
            if ($upload['storage'] != 'local' && isset($upload['uploadmode']) && $upload['uploadmode'] != 'server') {
                //临时修改上传模式为服务端中转
                set_addon_config($upload['storage'], ["uploadmode" => "server"], false);

                $upload = \app\common\model\Config::upload();
                // 上传信息配置后
                Hook::listen("upload_config_init", $upload);

                $upload = Config::set('upload', array_merge(Config::get('upload'), $upload));
            }

            $upload['cdnurl'] = $upload['cdnurl'] ? $upload['cdnurl'] : cdnurl('', true);
            $upload['uploadurl'] = preg_match("/^((?:[a-z]+:)?\/\/)(.*)/i", $upload['uploadurl']) ? $upload['uploadurl'] : url($upload['storage'] == 'local' ? '/api/common/upload' : $upload['uploadurl'], '', false, true);

            $content = [
王智 authored
53
                'citydata' => Area::getCityFromLngLat($lng, $lat),
王智 authored
54
                'versiondata' => Version::check($version),
王智 authored
55 56
                'uploaddata' => $upload,
                'coverdata' => Config::get("cover"),
王智 authored
57 58 59 60 61 62 63 64
            ];
            $this->success('', $content);
        } else {
            $this->error(__('Invalid parameters'));
        }
    }

    /**
王智 authored
65 66 67 68 69 70
     * 上传文件-七牛
     *
     * @ApiTitle    (上传文件-七牛)
     * @ApiSummary  (测试描述信息)
     * @ApiMethod   (POST)
     * @ApiParams   (name="file", type="file", required=true, description="用户名")
王智 authored
71
     */
王智 authored
72
    public function uploadQiniu()
王智 authored
73
    {
王智 authored
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
        $config = get_addon_config('qiniu');
        $file = $this->request->file('file');
        if (!$file || !$file->isValid()) {
            $this->error("请上传有效的文件");
        }
        $fileInfo = $file->getInfo();
        $filePath = $file->getRealPath() ?: $file->getPathname();
        preg_match('/(\d+)(\w+)/', $config['maxsize'], $matches);
        $type = strtolower($matches[2]);
        $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
        $size = (int)$config['maxsize'] * pow(1024000, isset($typeDict[$type]) ? $typeDict[$type] : 0);

        $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
        $suffix = $suffix ? $suffix : 'file';

        $md5 = md5_file($filePath);
        $search = ['$(year)', '$(mon)', '$(day)', '$(etag)', '$(ext)'];
        $replace = [date("Y"), date("m"), date("d"), $md5, '.' . $suffix];
        $object = ltrim(str_replace($search, $replace, $config['savekey']), '/');

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

        //检查文件大小
        if (!$file->checkSize($size)) {
            $this->error("起过最大可上传文件限制");
        }

        //验证文件后缀
        if ($config['mimetype'] !== '*' &&
            (
                !in_array($suffix, $mimetypeArr)
                || (stripos($typeArr[0] . '/', $config['mimetype']) !== false && (!in_array($fileInfo['type'], $mimetypeArr) && !in_array($typeArr[0] . '/*', $mimetypeArr)))
            )
        ) {
            $this->error(__('上传格式限制'));
        }

        $savekey = '/' . $object;

        $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);
        $fileName = substr($savekey, strripos($savekey, '/') + 1);
        //先上传到本地
        $splInfo = $file->move(ROOT_PATH . '/public' . $uploadDir, $fileName);
        if ($splInfo) {
            $extparam = $this->request->post();
            $filePath = $splInfo->getRealPath() ?: $splInfo->getPathname();

            $sha1 = sha1_file($filePath);
            $imagewidth = $imageheight = 0;
            if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf', 'pdf'])) {
                $imgInfo = getimagesize($splInfo->getPathname());
                $imagewidth = isset($imgInfo[0]) ? $imgInfo[0] : $imagewidth;
                $imageheight = isset($imgInfo[1]) ? $imgInfo[1] : $imageheight;
王智 authored
128
            }
王智 authored
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
            $params = array(
                'admin_id' => session('admin.id'),
                'user_id' => $this->auth->id,
                'filesize' => $fileInfo['size'],
                'imagewidth' => $imagewidth,
                'imageheight' => $imageheight,
                'imagetype' => $suffix,
                'imageframes' => 0,
                'mimetype' => $fileInfo['type'],
                'url' => $uploadDir . $splInfo->getSaveName(),
                'uploadtime' => time(),
                'storage' => 'local',
                'sha1' => $sha1,
                'extparam' => json_encode($extparam),
            );
            $attachment = Attachment::create(array_filter($params), true);
            $policy = array(
                'saveKey' => ltrim($savekey, '/'),
            );
            $auth = new Auth($config['accessKey'], $config['secretKey']);
            $token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy);
            $multipart = [
                ['name' => 'token', 'contents' => $token],
                [
                    'name' => 'file',
                    'contents' => fopen($filePath, 'r'),
                    'filename' => $fileName,
                ]
            ];
王智 authored
158
            try {
王智 authored
159 160 161 162 163 164 165 166 167 168
                $client = new \GuzzleHttp\Client();
                $res = $client->request('POST', $config['uploadurl'], [
                    'multipart' => $multipart
                ]);
                $code = $res->getStatusCode();
                //成功不做任何操作
            } catch (\GuzzleHttp\Exception\ClientException $e) {
                $attachment->delete();
                unlink($filePath);
                $this->error("上传失败");
王智 authored
169 170
            }
王智 authored
171
            $url = '/' . $object;
王智 authored
172
王智 authored
173 174 175 176 177 178 179 180
            //上传成功后将存储变更为qiniu
            $attachment->storage = 'qiniu';
            $attachment->save();
            $this->success("上传成功", ['url' => $url, 'furl' => cdnurl($url)]);
        } else {
            $this->error('上传失败');
        }
        return;
王智 authored
181
    }
1  
王智 authored
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203

    /**
     * @ApiTitle    (获取微信SDK配置)
     * @ApiSummary  (获取微信SDK配置)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/Common/getJsSdkConfig)
     * @ApiParams   (name="url", type="string", required=true, description="当前页面url")
     * @ApiParams   (name="api", type="string", required=true, description="要应用的API名称逗号分割")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturnParams   (name="url", type="string", required=true, sample="跳转地址")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功',
    })
     */
    public function getJsSdkConfig()
    {
        $api = input('api');
        $url = input('url');
        $config = config('wechat');
        // dump($config);
1  
王智 authored
204
        $APIs = explode(',', $api);
1  
王智 authored
205
        $Wechat = new Application($config);
1  
王智 authored
206 207 208 209
        dump($api);
        dump($url);
        dump($APIs);
        die;
1  
王智 authored
210
        $Wechat->js->setUrl($url);
1  
王智 authored
211
        $return['config'] = $Wechat->js->config($APIs, $debug = false, $beta = false, $json = false);
1  
王智 authored
212 213 214
        $this->success('', $return);
    }
王智 authored
215
}