<?php
namespace app\admin\controller;
use controller\BasicAdmin;
use service\FileService;
/**
* 插件助手控制器
* Class Plugs
* @package app\admin\controller
* @author Anyon <zoujingli@qq.com>
* @date 2017/02/21
*/
class Plugs extends BasicAdmin
{
public function upfile()
{
$uptype = $this->request->get('uptype');
if (!in_array($uptype, ['local', 'qiniu', 'oss'])) {
$uptype = sysconf('storage_type');
}
$mode = $this->request->get('mode', 'one');
$types = $this->request->get('type', 'jpg,png');
$this->assign('mimes', FileService::getFileMine($types));
$this->assign('field', $this->request->get('field', 'file'));
return $this->fetch('', ['mode' => $mode, 'types' => $types, 'uptype' => $uptype]);
}
public function upload()
{
$file = $this->request->file('file');
if (!$file->checkExt(strtolower(sysconf('storage_local_exts')))) {
return json(['code' => 'ERROR', 'msg' => '文件上传类型受限']);
}
$ext = strtolower(pathinfo($file->getInfo('name'), 4));
$names = str_split($this->request->post('md5'), 16);
$filename = "{$names[0]}/{$names[1]}.{$ext}";
if ($this->request->post('token') !== md5($filename . session_id())) {
return json(['code' => 'ERROR', 'msg' => '文件上传验证失败']);
}
if (($info = $file->move("static/upload/{$names[0]}", "{$names[1]}.{$ext}", true))) {
if (($site_url = FileService::getFileUrl($filename, 'local'))) {
return json(['data' => ['site_url' => $site_url], 'code' => 'SUCCESS', 'msg' => '文件上传成功']);
}
}
return json(['code' => 'ERROR', 'msg' => '文件上传失败']);
}
public function upstate()
{
if (uid()) {
$post = $this->request->post();
$filename = 'user_up/uid_' . uid() . '/' . join('/', str_split($post['md5'], 16)) . '.' . strtolower(pathinfo($post['filename'], 4));
if (($site_url = FileService::getFileUrl($filename))) {
$this->result(['site_url' => $site_url], 'IS_FOUND');
}
$config = ['uptype' => $post['uptype'], 'file_url' => $filename];
switch (strtolower($post['uptype'])) {
case 'local':
$config['server'] = FileService::getUploadLocalUrl();
$config['token'] = md5($filename . session_id());
break;
case 'qiniu':
$config['server'] = FileService::getUploadQiniuUrl(true);
$config['token'] = $this->_getQiniuToken($filename);
break;
case 'oss':
$time = time() + 3600;
$policyText = [
'expiration' => date('Y-m-d', $time) . 'T' . date('H:i:s', $time) . '.000Z',
'conditions' => [['content-length-range', 0, 1048576000]],
];
$config['server'] = FileService::getUploadOssUrl();
$config['policy'] = base64_encode(json_encode($policyText));
$config['site_url'] = FileService::getBaseUriOss() . $filename;
$config['signature'] = base64_encode(hash_hmac('sha1', $config['policy'], sysconf('storage_oss_secret'), true));
$config['OSSAccessKeyId'] = sysconf('storage_oss_keyid');
}
$this->result($config, 'NOT_FOUND');
} else {
$this->error("不允许匿名上传,请登录");
}
}
protected function _getQiniuToken($key)
{
$baseUrl = FileService::getBaseUriQiniu();
$bucket = sysconf('storage_qiniu_bucket');
$accessKey = sysconf('storage_qiniu_access_key');
$secretKey = sysconf('storage_qiniu_secret_key');
$params = [
"scope" => "{$bucket}:{$key}", "deadline" => 3600 + time(),
"returnBody" => "{\"data\":{\"site_url\":\"{$baseUrl}/$(key)\",\"file_url\":\"$(key)\"}, \"code\": \"SUCCESS\"}",
];
$data = str_replace(['+', '/'], ['-', '_'], base64_encode(json_encode($params)));
return $accessKey . ':' . str_replace(['+', '/'], ['-', '_'], base64_encode(hash_hmac('sha1', $data, $secretKey, true))) . ':' . $data;
}
public function icon()
{
$field = $this->request->get('field', 'icon');
return $this->fetch('', ['field' => $field]);
}
}